Version Description
Bug fixing - Undefined variable found in some places
Download this release
Release Info
Developer | wp-buy |
Plugin | Visitors Traffic Real Time Statistics |
Version | 1.3 |
Comparing to | |
See all releases |
Version 1.3
- Visitors-Traffic-Real-Time-Statistics.php +21 -0
- WPHitsCounter.php +519 -0
- crawlers.php +37 -0
- css/ar_css.css +73 -0
- css/en_css.css +117 -0
- css/en_newcss.css +115 -0
- database_basics_data.php +265 -0
- functions.php +1514 -0
- images/arrow_down.png +0 -0
- images/arrow_up.png +0 -0
- images/at_graph_icon.png +0 -0
- images/browsers/air.png +0 -0
- images/browsers/android.png +0 -0
- images/browsers/chrome.png +0 -0
- images/browsers/firefox.png +0 -0
- images/browsers/fluid.png +0 -0
- images/browsers/ie.png +0 -0
- images/browsers/ipad.png +0 -0
- images/browsers/maxthon.png +0 -0
- images/browsers/mozilla.png +0 -0
- images/browsers/netscape.png +0 -0
- images/browsers/opera.png +0 -0
- images/browsers/safari.png +0 -0
- images/browsers/unknown.png +0 -0
- images/browsers_nodata.png +0 -0
- images/contact-center-reporting-icon.png +0 -0
- images/flags/Bouvet Island.png +0 -0
- images/flags/Faroe Islands.png +0 -0
- images/flags/ad.png +0 -0
- images/flags/ae.png +0 -0
- images/flags/af.png +0 -0
- images/flags/ag.png +0 -0
- images/flags/ai.png +0 -0
- images/flags/al.png +0 -0
- images/flags/am.png +0 -0
- images/flags/an.png +0 -0
- images/flags/ao.png +0 -0
- images/flags/ar.png +0 -0
- images/flags/as.png +0 -0
- images/flags/at.png +0 -0
- images/flags/au.png +0 -0
- images/flags/aw.png +0 -0
- images/flags/az.png +0 -0
- images/flags/ba.png +0 -0
- images/flags/bb.png +0 -0
- images/flags/bd.png +0 -0
- images/flags/be.png +0 -0
- images/flags/bf.png +0 -0
- images/flags/bg.png +0 -0
- images/flags/bh.png +0 -0
- images/flags/bi.png +0 -0
- images/flags/bj.png +0 -0
- images/flags/bm.png +0 -0
- images/flags/bn.png +0 -0
- images/flags/bo.png +0 -0
- images/flags/br.png +0 -0
- images/flags/bs.png +0 -0
- images/flags/bt.png +0 -0
- images/flags/bw.png +0 -0
- images/flags/by.png +0 -0
- images/flags/bz.png +0 -0
- images/flags/ca.png +0 -0
- images/flags/cc.png +0 -0
- images/flags/cd.png +0 -0
- images/flags/cf.png +0 -0
- images/flags/cg.png +0 -0
- images/flags/ch.png +0 -0
- images/flags/ci.png +0 -0
- images/flags/ck.png +0 -0
- images/flags/cl.png +0 -0
- images/flags/cm.png +0 -0
- images/flags/cn.png +0 -0
- images/flags/co.png +0 -0
- images/flags/cr.png +0 -0
- images/flags/cs.png +0 -0
- images/flags/cu.png +0 -0
- images/flags/cv.png +0 -0
- images/flags/cx.png +0 -0
- images/flags/cy.png +0 -0
- images/flags/cz.png +0 -0
- images/flags/de.png +0 -0
- images/flags/dh.png +0 -0
- images/flags/dj.png +0 -0
- images/flags/dk.png +0 -0
- images/flags/dm.png +0 -0
- images/flags/do.png +0 -0
- images/flags/dz.png +0 -0
- images/flags/ec.png +0 -0
- images/flags/ee.png +0 -0
- images/flags/eg.png +0 -0
- images/flags/eh.png +0 -0
- images/flags/er.png +0 -0
- images/flags/es.png +0 -0
- images/flags/et.png +0 -0
- images/flags/fi.png +0 -0
- images/flags/fj.png +0 -0
- images/flags/fk.png +0 -0
- images/flags/fm.png +0 -0
- images/flags/fr.png +0 -0
- images/flags/fx.png +0 -0
- images/flags/ga.png +0 -0
- images/flags/gb.png +0 -0
- images/flags/gd.png +0 -0
- images/flags/ge.png +0 -0
- images/flags/gf.png +0 -0
- images/flags/gh.png +0 -0
- images/flags/gi.png +0 -0
- images/flags/gl.png +0 -0
- images/flags/gm.png +0 -0
- images/flags/gn.png +0 -0
- images/flags/gp.png +0 -0
- images/flags/gq.png +0 -0
- images/flags/gr.png +0 -0
- images/flags/gt.png +0 -0
- images/flags/gu.png +0 -0
- images/flags/gw.png +0 -0
- images/flags/gy.png +0 -0
- images/flags/hk.png +0 -0
- images/flags/hm.png +0 -0
- images/flags/hn.png +0 -0
- images/flags/hr.png +0 -0
- images/flags/ht.png +0 -0
- images/flags/hu.png +0 -0
- images/flags/id.png +0 -0
- images/flags/ie.png +0 -0
- images/flags/il.png +0 -0
- images/flags/in.png +0 -0
- images/flags/io.png +0 -0
- images/flags/iq.png +0 -0
- images/flags/ir.png +0 -0
- images/flags/is.png +0 -0
- images/flags/it.png +0 -0
- images/flags/jm.png +0 -0
- images/flags/jo.png +0 -0
- images/flags/jp.png +0 -0
- images/flags/ke.png +0 -0
- images/flags/kg.png +0 -0
- images/flags/kh.png +0 -0
- images/flags/ki.png +0 -0
- images/flags/km.png +0 -0
- images/flags/kn.png +0 -0
- images/flags/kp.png +0 -0
- images/flags/kr.png +0 -0
- images/flags/ks.png +0 -0
- images/flags/kw.png +0 -0
- images/flags/ky.png +0 -0
- images/flags/kz.png +0 -0
- images/flags/la.png +0 -0
- images/flags/lb.png +0 -0
- images/flags/lc.png +0 -0
- images/flags/li.png +0 -0
- images/flags/lk.png +0 -0
- images/flags/lr.png +0 -0
- images/flags/ls.png +0 -0
- images/flags/lt.png +0 -0
- images/flags/lu.png +0 -0
- images/flags/lv.png +0 -0
- images/flags/ly.png +0 -0
- images/flags/ma.png +0 -0
- images/flags/mc.png +0 -0
- images/flags/md.png +0 -0
- images/flags/me.png +0 -0
- images/flags/mg.png +0 -0
- images/flags/mh.png +0 -0
- images/flags/mk.png +0 -0
- images/flags/ml.png +0 -0
- images/flags/mm.png +0 -0
- images/flags/mn.png +0 -0
- images/flags/mo.png +0 -0
- images/flags/mp.png +0 -0
- images/flags/mq.png +0 -0
- images/flags/mr.png +0 -0
- images/flags/ms.png +0 -0
- images/flags/mt.png +0 -0
- images/flags/mu.png +0 -0
- images/flags/mv.png +0 -0
- images/flags/mw.png +0 -0
- images/flags/mx.png +0 -0
- images/flags/my.png +0 -0
- images/flags/mz.png +0 -0
- images/flags/na.png +0 -0
- images/flags/nc.png +0 -0
- images/flags/ne.png +0 -0
- images/flags/nf.png +0 -0
- images/flags/ng.png +0 -0
- images/flags/ni.png +0 -0
- images/flags/nl.png +0 -0
- images/flags/no.png +0 -0
- images/flags/noFlag.png +0 -0
- images/flags/np.png +0 -0
- images/flags/nr.png +0 -0
- images/flags/nu.png +0 -0
- images/flags/nz.png +0 -0
- images/flags/om.png +0 -0
- images/flags/pa.png +0 -0
- images/flags/pe.png +0 -0
- images/flags/pf.png +0 -0
- images/flags/pg.png +0 -0
- images/flags/ph.png +0 -0
- images/flags/pk.png +0 -0
- images/flags/pl.png +0 -0
- images/flags/pm.png +0 -0
- images/flags/pn.png +0 -0
- images/flags/pr.png +0 -0
- images/flags/ps.png +0 -0
- images/flags/pt.png +0 -0
- images/flags/pw.png +0 -0
- images/flags/py.png +0 -0
- images/flags/qa.png +0 -0
- images/flags/re.png +0 -0
- images/flags/ro.png +0 -0
- images/flags/rs.png +0 -0
- images/flags/ru.png +0 -0
- images/flags/rw.png +0 -0
- images/flags/sa.png +0 -0
- images/flags/sb.png +0 -0
- images/flags/sc.png +0 -0
- images/flags/sd.png +0 -0
- images/flags/se.png +0 -0
- images/flags/sg.png +0 -0
- images/flags/sh.png +0 -0
- images/flags/si.png +0 -0
- images/flags/sj.png +0 -0
- images/flags/sk.png +0 -0
- images/flags/sl.png +0 -0
- images/flags/sm.png +0 -0
- images/flags/sn.png +0 -0
- images/flags/so.png +0 -0
- images/flags/sr.png +0 -0
- images/flags/st.png +0 -0
- images/flags/su.png +0 -0
- images/flags/sv.png +0 -0
- images/flags/sy.png +0 -0
- images/flags/sz.png +0 -0
- images/flags/tc.png +0 -0
- images/flags/td.png +0 -0
- images/flags/tf.png +0 -0
- images/flags/tg.png +0 -0
- images/flags/th.png +0 -0
- images/flags/tj.png +0 -0
- images/flags/tk.png +0 -0
- images/flags/tl.png +0 -0
- images/flags/tm.png +0 -0
- images/flags/tn.png +0 -0
- images/flags/to.png +0 -0
- images/flags/tp.png +0 -0
- images/flags/tr.png +0 -0
- images/flags/tt.png +0 -0
- images/flags/tv.png +0 -0
- images/flags/tw.png +0 -0
- images/flags/tz.png +0 -0
- images/flags/ua.png +0 -0
- images/flags/ug.png +0 -0
- images/flags/uk.png +0 -0
- images/flags/um.png +0 -0
- images/flags/us.png +0 -0
- images/flags/uy.png +0 -0
- images/flags/uz.png +0 -0
- images/flags/va.png +0 -0
- images/flags/vc.png +0 -0
- images/flags/ve.png +0 -0
- images/flags/vg.png +0 -0
- images/flags/vn.png +0 -0
- images/flags/vs.png +0 -0
- images/flags/vu.png +0 -0
- images/flags/wf.png +0 -0
- images/flags/ws.png +0 -0
- images/flags/xx.png +0 -0
- images/flags/ye.png +0 -0
- images/flags/yu.png +0 -0
- images/flags/za.png +0 -0
- images/flags/zm.png +0 -0
- images/flags/zr.png +0 -0
- images/flags/zw.png +0 -0
- images/headerbg.png +0 -0
- images/hitslogo.png +0 -0
- images/latestwords_nodata.png +0 -0
- images/myheaderbg.png +0 -0
- images/recent_nodata.png +0 -0
- images/se_nodata.png +0 -0
- images/search_engines/aol.png +0 -0
- images/search_engines/ask.png +0 -0
- images/search_engines/baiduspider.png +0 -0
- images/search_engines/bing.png +0 -0
- images/search_engines/dotmic.gif +0 -0
- images/search_engines/duckduckgo.png +0 -0
- images/search_engines/google.png +0 -0
- images/search_engines/webcrawler.gif +0 -0
- images/search_engines/yahoo.png +0 -0
- images/search_engines/yandex.png +0 -0
- images/topref_nodata.png +0 -0
- images/upgrade.png +0 -0
- images/upgrade1.jpg +0 -0
- images/upgrade2.jpg +0 -0
- images/upgrade3.jpg +0 -0
- images/upgrade4.jpg +0 -0
- images/upgradenow-button.png +0 -0
- images/vtrts.png +0 -0
- images/vtrts_ads.gif +0 -0
- images/vtrtspro.png +0 -0
- images/widget.png +0 -0
- init.php +49 -0
- js/js.js +183 -0
- lang/ar_lang.php +48 -0
- lang/en_lang.php +48 -0
- lang/js/ar_lang.js +5 -0
- lang/js/en_lang.js +5 -0
- lib/Chart_js/.gitignore +7 -0
- lib/Chart_js/CONTRIBUTING.md +20 -0
- lib/Chart_js/Chart.js +3379 -0
- lib/Chart_js/Chart.min.js +11 -0
- lib/Chart_js/LICENSE.md +7 -0
- lib/Chart_js/README.md +20 -0
- lib/Chart_js/bower.json +11 -0
- lib/Chart_js/docs/00-Getting-Started.md +200 -0
- lib/Chart_js/docs/01-Line-Chart.md +160 -0
- lib/Chart_js/docs/02-Bar-Chart.md +143 -0
- lib/Chart_js/docs/03-Radar-Chart.md +177 -0
- lib/Chart_js/docs/04-Polar-Area-Chart.md +172 -0
- lib/Chart_js/docs/05-Pie-Doughnut-Chart.md +158 -0
- lib/Chart_js/docs/06-Advanced.md +152 -0
- lib/Chart_js/docs/07-Notes.md +42 -0
- lib/Chart_js/gulpfile.js +131 -0
- lib/Chart_js/package.json +24 -0
- lib/Chart_js/samples/bar.html +48 -0
- lib/Chart_js/samples/doughnut.html +67 -0
- lib/Chart_js/samples/line.html +54 -0
- lib/Chart_js/samples/pie.html +58 -0
- lib/Chart_js/samples/polar-area.html +60 -0
- lib/Chart_js/samples/radar.html +53 -0
- lib/Chart_js/src/Chart.Bar.js +294 -0
- lib/Chart_js/src/Chart.Core.js +1943 -0
- lib/Chart_js/src/Chart.Doughnut.js +184 -0
- lib/Chart_js/src/Chart.Line.js +366 -0
- lib/Chart_js/src/Chart.PolarArea.js +248 -0
- lib/Chart_js/src/Chart.Radar.js +343 -0
- lib/bootstrap/css/bootstrap-theme.css +457 -0
- lib/bootstrap/css/bootstrap-theme.css.map +1 -0
- lib/bootstrap/css/bootstrap-theme.min.css +5 -0
- lib/bootstrap/css/bootstrap.css +6358 -0
- lib/bootstrap/css/bootstrap.css.map +1 -0
Visitors-Traffic-Real-Time-Statistics.php
ADDED
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/*
|
3 |
+
Plugin Name: Visitors Traffic Real Time Statistics
|
4 |
+
Description: Hits counter that shows analytical numbers of your WordPress site visitors and hits. <a href="admin.php?page=ahc_hits_counter_menu">Dashboard</a> | <a href="http://www.wp-buy.com/product/visitors-traffic-real-time-statistics-pro">Upgrade to pro.</a>
|
5 |
+
Author: wp-buy
|
6 |
+
Author URI: https://www.wp-buy.com/
|
7 |
+
Version: 1.3
|
8 |
+
|
9 |
+
*/
|
10 |
+
|
11 |
+
define('AHC_PLUGIN_MAIN_FILE', __FILE__);
|
12 |
+
define('AHC_PLUGIN_ROOT_DIR', dirname(__FILE__));
|
13 |
+
|
14 |
+
require_once("functions.php");
|
15 |
+
require_once("init.php");
|
16 |
+
|
17 |
+
$path = plugin_basename( __FILE__ );
|
18 |
+
add_action("after_plugin_row_{$path}", 'ahc_after_plugin_row', 10, 3);
|
19 |
+
|
20 |
+
//--------------------------------------------
|
21 |
+
?>
|
WPHitsCounter.php
ADDED
@@ -0,0 +1,519 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
//use GeoIp2\Database\Reader;
|
4 |
+
|
5 |
+
class WPHitsCounter{
|
6 |
+
|
7 |
+
var $pageId;
|
8 |
+
var $pageTitle;
|
9 |
+
var $postType;
|
10 |
+
var $ipAddress;
|
11 |
+
var $ipIsUnknown;
|
12 |
+
var $userAgent;
|
13 |
+
var $referer;
|
14 |
+
var $refererSite;
|
15 |
+
var $browser;
|
16 |
+
var $searchEngine;
|
17 |
+
var $keyWords;
|
18 |
+
var $requestUri;
|
19 |
+
|
20 |
+
|
21 |
+
/**
|
22 |
+
* Constructor
|
23 |
+
*
|
24 |
+
* @param integer $page_id
|
25 |
+
* @param string $page_title Optional
|
26 |
+
* @param string $post_type Optional
|
27 |
+
*/
|
28 |
+
public function __construct($page_id, $page_title = NULL, $post_type = NULL){
|
29 |
+
global $_SERVER;
|
30 |
+
$this->ipAddress = ahc_get_client_ip_address();
|
31 |
+
if($this->ipAddress == 'UNKNOWN'){
|
32 |
+
$this->ipIsUnknown = true;
|
33 |
+
$this->ipAddress = 'UNKNOWN'.uniqid();
|
34 |
+
} else{
|
35 |
+
$this->ipIsUnknown = false;
|
36 |
+
}
|
37 |
+
|
38 |
+
$this->userAgent = $_SERVER['HTTP_USER_AGENT'];
|
39 |
+
$this->pageId = (isset($_GET['page_id'])) ? $_GET['page_id'] : $page_id;
|
40 |
+
$this->pageTitle = $page_title;
|
41 |
+
$this->postType = $post_type;
|
42 |
+
$this->requestUri = trim($_SERVER['REQUEST_URI'], '/');
|
43 |
+
if(isset($_SERVER['HTTP_REFERER']) && !empty($_SERVER['HTTP_REFERER'])){
|
44 |
+
$hostName = parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST);
|
45 |
+
if($hostName != $_SERVER['SERVER_NAME']){
|
46 |
+
$this->referer = $_SERVER['HTTP_REFERER'];
|
47 |
+
$this->refererSite = $hostName;
|
48 |
+
}
|
49 |
+
}
|
50 |
+
$this->searchEngine = NULL;
|
51 |
+
$this->keyWords = NULL;
|
52 |
+
}
|
53 |
+
//--------------------------------------------
|
54 |
+
/**
|
55 |
+
* Trace visitor hit
|
56 |
+
*
|
57 |
+
* @return void
|
58 |
+
*/
|
59 |
+
public function traceVisitorHit(){
|
60 |
+
$this->cleanUnwantedRecords();
|
61 |
+
$this->cleanHitsTable();
|
62 |
+
if(!$this->isHitRecorded()){
|
63 |
+
$visitorRecorded = $this->isVisitorRecorded();
|
64 |
+
$this->getBrowser();
|
65 |
+
usleep(10000);
|
66 |
+
if(!empty($this->refererSite)){
|
67 |
+
$this->getSearchEngine();
|
68 |
+
}
|
69 |
+
|
70 |
+
if(!$this->isTodayPreparedInDb()){
|
71 |
+
$this->PrepareForTodayInDb();
|
72 |
+
}
|
73 |
+
|
74 |
+
if(!$visitorRecorded){
|
75 |
+
$this->updateVisitsTime(1, 1);
|
76 |
+
$this->updateVisitors(1, 1);
|
77 |
+
} else{
|
78 |
+
$this->updateVisitsTime(0, 1);
|
79 |
+
$this->updateVisitors(0, 1);
|
80 |
+
}
|
81 |
+
|
82 |
+
if(!empty($this->pageId) && !empty($this->pageTitle) && $this->postType == 'post'){
|
83 |
+
$this->updateTitleTraffic($this->pageId, $this->pageTitle);
|
84 |
+
}
|
85 |
+
|
86 |
+
if(!empty($this->keyWords) && !empty($this->searchEngine)){
|
87 |
+
$this->updateKeywords($this->ipAddress, $this->keyWords, $this->referer, $this->searchEngine, $this->browser);
|
88 |
+
}
|
89 |
+
|
90 |
+
if(!empty($this->refererSite)){
|
91 |
+
$this->updateReferingSites($this->refererSite);
|
92 |
+
}
|
93 |
+
|
94 |
+
if(!empty($this->searchEngine)){
|
95 |
+
$this->updateSearchingVisits($this->searchEngine);
|
96 |
+
}
|
97 |
+
|
98 |
+
$this->updateBrowsers($this->browser);
|
99 |
+
|
100 |
+
if(!$visitorRecorded){
|
101 |
+
$this->updateRecentVisitors($this->ipAddress, $this->referer, $this->searchEngine, $this->browser);
|
102 |
+
}
|
103 |
+
|
104 |
+
$this->recordThisHits();
|
105 |
+
}
|
106 |
+
}
|
107 |
+
//--------------------------------------------
|
108 |
+
/**
|
109 |
+
* Is visit is already recorded
|
110 |
+
*
|
111 |
+
* @return boolean
|
112 |
+
*/
|
113 |
+
protected function isHitRecorded(){
|
114 |
+
global $wpdb;
|
115 |
+
$sql = "SELECT COUNT(`hit_id`) AS ct FROM `ahc_hits` WHERE DATE(`hit_date`) = DATE(NOW()) AND `hit_ip_address` = %s AND `hit_page_id` = %s";
|
116 |
+
$result = $wpdb->get_results($wpdb->prepare($sql, $this->ipAddress, $this->pageId) , OBJECT);
|
117 |
+
if($result !== false){
|
118 |
+
return ((int) $result[0]->ct > 0);
|
119 |
+
}
|
120 |
+
}
|
121 |
+
//--------------------------------------------
|
122 |
+
/**
|
123 |
+
* Is visitor is already recorded
|
124 |
+
*
|
125 |
+
* @return boolean
|
126 |
+
*/
|
127 |
+
protected function isVisitorRecorded(){
|
128 |
+
global $wpdb;
|
129 |
+
$sql = "SELECT COUNT(`hit_id`) AS ct FROM `ahc_hits` WHERE DATE(`hit_date`) = DATE(NOW()) AND `hit_ip_address` = %s";
|
130 |
+
$result = $wpdb->get_results($wpdb->prepare($sql, $this->ipAddress), OBJECT);
|
131 |
+
if($result !== false){
|
132 |
+
return ((int) $result[0]->ct > 0);
|
133 |
+
}
|
134 |
+
}
|
135 |
+
//--------------------------------------------
|
136 |
+
/**
|
137 |
+
* Detect client browser
|
138 |
+
*
|
139 |
+
* @return void
|
140 |
+
*/
|
141 |
+
protected function getBrowser(){
|
142 |
+
if(strpos($this->userAgent, 'MSIE') !== false){
|
143 |
+
$this->browser = 1;
|
144 |
+
}
|
145 |
+
elseif(strpos($this->userAgent, 'Trident') !== false){
|
146 |
+
$this->browser = 1;
|
147 |
+
}
|
148 |
+
elseif(strpos($this->userAgent, 'Gecko') !== false){
|
149 |
+
if(strpos($this->userAgent, 'Firefox') !== false){
|
150 |
+
$this->browser = 2;
|
151 |
+
}
|
152 |
+
elseif(strpos($this->userAgent, 'Netscape') !== false){
|
153 |
+
$this->browser = 3;
|
154 |
+
}
|
155 |
+
elseif(strpos($this->userAgent, 'Chrome') !== false){
|
156 |
+
$this->browser = 4;
|
157 |
+
}
|
158 |
+
else{
|
159 |
+
$this->browser = 5;
|
160 |
+
}
|
161 |
+
}
|
162 |
+
elseif(strpos($this->userAgent, 'Opera Mini') !== false){
|
163 |
+
$this->browser = 6;
|
164 |
+
}
|
165 |
+
elseif(strpos($this->userAgent, 'Opera') !== false){
|
166 |
+
$this->browser = 7;
|
167 |
+
}
|
168 |
+
elseif(strpos($this->userAgent, 'Safari') !== false){
|
169 |
+
$this->browser = 8;
|
170 |
+
}
|
171 |
+
elseif(strpos($this->userAgent, 'iPad') !== false){
|
172 |
+
$this->browser = 9;
|
173 |
+
}
|
174 |
+
elseif(strpos($this->userAgent, 'Android') !== false){
|
175 |
+
$this->browser = 10;
|
176 |
+
}
|
177 |
+
elseif(strpos($this->userAgent, 'AIR') !== false){
|
178 |
+
$this->browser = 11;
|
179 |
+
}
|
180 |
+
elseif(strpos($this->userAgent, 'Fluid') !== false){
|
181 |
+
$this->browser = 12;
|
182 |
+
}
|
183 |
+
elseif(strpos($this->userAgent, 'Maxthon') !== false){
|
184 |
+
$this->browser = 13;
|
185 |
+
}
|
186 |
+
else{
|
187 |
+
$this->browser = 14;
|
188 |
+
}
|
189 |
+
}
|
190 |
+
//--------------------------------------------
|
191 |
+
/**
|
192 |
+
* Detect search engine
|
193 |
+
*
|
194 |
+
* @uses wpdb::prepare()
|
195 |
+
* @uses wpdb::get_results()
|
196 |
+
*
|
197 |
+
* @return void
|
198 |
+
*/
|
199 |
+
protected function getSearchEngine(){
|
200 |
+
global $wpdb;
|
201 |
+
$sql = "SELECT `srh_id`, `srh_query_parameter`, `srh_identifier` FROM `ahc_search_engines`";
|
202 |
+
$results = $wpdb->get_results($sql, OBJECT);
|
203 |
+
if($results !== false){
|
204 |
+
foreach($results as $s){
|
205 |
+
if(strpos($this->referer, $s->srh_identifier.'.') !== false){
|
206 |
+
$this->searchEngine = $s->srh_id;
|
207 |
+
$this->getKeyWords($s->srh_query_parameter);
|
208 |
+
}
|
209 |
+
}
|
210 |
+
}
|
211 |
+
}
|
212 |
+
//--------------------------------------------
|
213 |
+
/**
|
214 |
+
* Detect search engine
|
215 |
+
*
|
216 |
+
* @uses wpdb::prepare()
|
217 |
+
* @uses wpdb::get_results()
|
218 |
+
*
|
219 |
+
* @return void
|
220 |
+
*/
|
221 |
+
protected function getKeyWords($query_param){
|
222 |
+
$query = parse_url($this->referer, PHP_URL_QUERY);
|
223 |
+
$query = rawurldecode($query);
|
224 |
+
$arr = array();
|
225 |
+
parse_str($query, $arr);
|
226 |
+
if(isset($arr[$query_param])){
|
227 |
+
$this->keyWords = $arr[$query_param];
|
228 |
+
}
|
229 |
+
}
|
230 |
+
//--------------------------------------------
|
231 |
+
/**
|
232 |
+
* Is there a record prepared for today's visits
|
233 |
+
*
|
234 |
+
* @uses wpdb::get_results()
|
235 |
+
*
|
236 |
+
* @return boolean
|
237 |
+
*/
|
238 |
+
protected function isTodayPreparedInDb(){
|
239 |
+
global $wpdb;
|
240 |
+
$sql = "SELECT COUNT(`vst_id`) AS ct FROM `ahc_visitors` WHERE DATE(`vst_date`) = DATE(NOW())";
|
241 |
+
$result = $wpdb->get_results($sql, OBJECT);
|
242 |
+
if($result !== false){
|
243 |
+
return ((int) $result[0]->ct > 0);
|
244 |
+
}
|
245 |
+
}
|
246 |
+
//--------------------------------------------
|
247 |
+
/**
|
248 |
+
* Prepared a record for today's visits
|
249 |
+
*
|
250 |
+
* @uses wpdb::query()
|
251 |
+
*
|
252 |
+
* @return boolean
|
253 |
+
*/
|
254 |
+
protected function PrepareForTodayInDb(){
|
255 |
+
global $wpdb;
|
256 |
+
$sql = "INSERT INTO `ahc_visitors` (`vst_date`, `vst_visitors`, `vst_visits`) VALUES (NOW(), 0, 0)";
|
257 |
+
if($wpdb->query($sql) !== false){
|
258 |
+
return true;
|
259 |
+
}
|
260 |
+
return false;
|
261 |
+
}
|
262 |
+
//--------------------------------------------
|
263 |
+
/**
|
264 |
+
* Clean daily hits table
|
265 |
+
*
|
266 |
+
* @uses wpdb::query()
|
267 |
+
*
|
268 |
+
* @return boolean
|
269 |
+
*/
|
270 |
+
protected function cleanHitsTable(){
|
271 |
+
global $wpdb;
|
272 |
+
$sql = "DELETE FROM `ahc_hits` WHERE DATE(`hit_date`) <> DATE(NOW())";
|
273 |
+
if($wpdb->query($sql) !== false){
|
274 |
+
return true;
|
275 |
+
} else{
|
276 |
+
return false;
|
277 |
+
}
|
278 |
+
}
|
279 |
+
//--------------------------------------------
|
280 |
+
/**
|
281 |
+
* Update browser visits
|
282 |
+
*
|
283 |
+
* @uses wpdb::prepare()
|
284 |
+
* @uses wpdb::query()
|
285 |
+
*
|
286 |
+
* @param integer $bsr_id
|
287 |
+
* @return boolean
|
288 |
+
*/
|
289 |
+
protected function updateBrowsers($bsr_id){
|
290 |
+
global $wpdb;
|
291 |
+
$sql = "UPDATE `ahc_browsers` SET bsr_visits = bsr_visits + 1 WHERE bsr_id = %d";
|
292 |
+
if($wpdb->query($wpdb->prepare($sql, $bsr_id)) !== false){
|
293 |
+
return true;
|
294 |
+
}
|
295 |
+
return false;
|
296 |
+
}
|
297 |
+
//--------------------------------------------
|
298 |
+
/**
|
299 |
+
* Update visits sum order by search engine
|
300 |
+
*
|
301 |
+
* @uses wpdb::prepare()
|
302 |
+
* @uses wpdb::get_results()
|
303 |
+
* @uses wpdb::query()
|
304 |
+
*
|
305 |
+
* @param integer $srh_id
|
306 |
+
* @return boolean
|
307 |
+
*/
|
308 |
+
protected function updateSearchingVisits($srh_id){
|
309 |
+
global $wpdb;
|
310 |
+
$sql = "SELECT vtsh_id FROM `ahc_searching_visits` WHERE srh_id = %d AND DATE(vtsh_date) = DATE(NOW())";
|
311 |
+
$result = $wpdb->get_results($wpdb->prepare($sql, $srh_id), OBJECT);
|
312 |
+
if($result !== false){
|
313 |
+
if($wpdb->num_rows > 0){
|
314 |
+
$sql2 = "UPDATE `ahc_searching_visits` SET vtsh_visits = vtsh_visits + 1 WHERE vtsh_id = %d";
|
315 |
+
return ($wpdb->query($wpdb->prepare($sql2, $result[0]->vtsh_id)) !== false);
|
316 |
+
} else{
|
317 |
+
$sql2 = "INSERT INTO `ahc_searching_visits` (srh_id, vtsh_date, vtsh_visits)
|
318 |
+
VALUES (%d, NOW(), 1)";
|
319 |
+
return ($wpdb->query($wpdb->prepare($sql2, $srh_id)) !== false);
|
320 |
+
}
|
321 |
+
} else{
|
322 |
+
return false;
|
323 |
+
}
|
324 |
+
}
|
325 |
+
//--------------------------------------------
|
326 |
+
/**
|
327 |
+
* Update visitors count
|
328 |
+
*
|
329 |
+
* @uses wpdb::prepare()
|
330 |
+
* @uses wpdb::query()
|
331 |
+
*
|
332 |
+
* @param integer $visitors Optional
|
333 |
+
* @param integer $visits Optional
|
334 |
+
* @return boolean
|
335 |
+
*/
|
336 |
+
protected function updateVisitors($visitors = 0, $visits = 0){
|
337 |
+
global $wpdb;
|
338 |
+
$sql = "UPDATE `ahc_visitors` SET vst_visitors = vst_visitors + %d, vst_visits = vst_visits + %d
|
339 |
+
WHERE DATE(vst_date) = DATE(NOW())";
|
340 |
+
return ($wpdb->query($wpdb->prepare($sql, $visitors, $visits)) !== false);
|
341 |
+
}
|
342 |
+
//--------------------------------------------
|
343 |
+
/**
|
344 |
+
* Update referring sites visits table
|
345 |
+
*
|
346 |
+
* @uses wpdb::prepare()
|
347 |
+
* @uses wpdb::query()
|
348 |
+
* @uses wpdb::get_results()
|
349 |
+
*
|
350 |
+
* @param string $rfr_site_name. referring site name
|
351 |
+
* @return boolean
|
352 |
+
*/
|
353 |
+
protected function updateReferingSites($rfr_site_name){
|
354 |
+
global $wpdb;
|
355 |
+
$sql = "SELECT rfr_id FROM `ahc_refering_sites` where rfr_site_name = %s";
|
356 |
+
$result = $wpdb->get_results($wpdb->prepare($sql, $rfr_site_name), OBJECT);
|
357 |
+
if($result !== false){
|
358 |
+
if(!empty($result)){
|
359 |
+
$sql2 = "UPDATE `ahc_refering_sites` SET rfr_visits = rfr_visits + 1 WHERE rfr_id = %d";
|
360 |
+
return ($wpdb->query($wpdb->prepare($sql2, $result[0]->rfr_id)) !== false);
|
361 |
+
} else{
|
362 |
+
$sql2 = "INSERT INTO `ahc_refering_sites` (rfr_site_name, rfr_visits)
|
363 |
+
VALUES(%s, 1)";
|
364 |
+
return ($wpdb->query($wpdb->prepare($sql2, $rfr_site_name)) !== false);
|
365 |
+
}
|
366 |
+
} else{
|
367 |
+
return false;
|
368 |
+
}
|
369 |
+
}
|
370 |
+
//--------------------------------------------
|
371 |
+
/**
|
372 |
+
* Update recent visitors table
|
373 |
+
*
|
374 |
+
* @uses wpdb::prepare()
|
375 |
+
* @uses wpdb::query()
|
376 |
+
*
|
377 |
+
* @param string $vtr_ip_address. IP address
|
378 |
+
* @param string $vtr_referer Optional. Referring site name
|
379 |
+
* @param integer $srh_id Optional. Search engine ID
|
380 |
+
* @param integer $bsr_id Optional. Browser ID
|
381 |
+
* @param integer $ctr_id Optional. Country ID
|
382 |
+
* @return boolean
|
383 |
+
*/
|
384 |
+
protected function updateRecentVisitors($vtr_ip_address, $vtr_referer = '', $srh_id = NULL, $bsr_id = NULL, $ctr_id = NULL){
|
385 |
+
global $wpdb;
|
386 |
+
$sql = "INSERT INTO `ahc_recent_visitors` (vtr_ip_address, vtr_referer, srh_id, bsr_id, ctr_id, vtr_date, vtr_time)
|
387 |
+
VALUES (%s, %s, %d, %d, %d, NOW(), NOW())";
|
388 |
+
return ($wpdb->query($wpdb->prepare($sql, $vtr_ip_address, $vtr_referer, $srh_id, $bsr_id, $ctr_id)) !== false);
|
389 |
+
}
|
390 |
+
//--------------------------------------------
|
391 |
+
/**
|
392 |
+
* Update key words table
|
393 |
+
*
|
394 |
+
* @uses wpdb::prepare()
|
395 |
+
* @uses wpdb::query()
|
396 |
+
*
|
397 |
+
* @param string $vtr_ip_address. IP address
|
398 |
+
* @param string $kwd_keywords. Key word
|
399 |
+
* @param string $kwd_referer. Referring site name.
|
400 |
+
* @param integer $srh_id. Search engine ID
|
401 |
+
* @param integer $bsr_id. Browser ID
|
402 |
+
* @return boolean
|
403 |
+
*/
|
404 |
+
protected function updateKeywords($kwd_ip_address, $kwd_keywords, $kwd_referer, $srh_id, $bsr_id){
|
405 |
+
global $wpdb;
|
406 |
+
$sql = "INSERT INTO `ahc_keywords` (kwd_ip_address, kwd_keywords, kwd_referer, srh_id, bsr_id, kwd_date, kwd_time)
|
407 |
+
VALUES (%s, %s, %s, %d, %d, NOW(), NOW())";
|
408 |
+
return ($wpdb->query($wpdb->prepare($sql, $kwd_ip_address, $kwd_keywords, $kwd_referer, $srh_id, $bsr_id)) !== false);
|
409 |
+
}
|
410 |
+
//--------------------------------------------
|
411 |
+
/**
|
412 |
+
* Clean unwanted records. Only keeping a limit of fresh records. Limit is set by AHC_RECENT_VISITORS_LIMIT
|
413 |
+
*
|
414 |
+
* @uses wpdb::prepare()
|
415 |
+
* @uses wpdb::get_results()
|
416 |
+
* @uses wpdb::query()
|
417 |
+
*
|
418 |
+
* @return boolean
|
419 |
+
*/
|
420 |
+
protected function cleanUnwantedRecords(){
|
421 |
+
global $wpdb;
|
422 |
+
$sql11 = "SELECT vtr_id FROM `ahc_recent_visitors` ORDER BY vtr_id LIMIT %d";
|
423 |
+
$result = $wpdb->get_results($wpdb->prepare($sql11, AHC_RECENT_VISITORS_LIMIT), OBJECT);
|
424 |
+
if($result !== false){
|
425 |
+
$ids1 = array();
|
426 |
+
$length = count($result);
|
427 |
+
foreach($result as $r){
|
428 |
+
$ids1[] = $r->vtr_id;
|
429 |
+
}
|
430 |
+
$ids1 = implode(',', $ids1);
|
431 |
+
$sql12 = "DELETE FROM `ahc_recent_visitors`".((!empty($ids1))? " WHERE vtr_id NOT IN (".$ids1.")" : "");
|
432 |
+
|
433 |
+
$sql21 = "SELECT kwd_id FROM `ahc_keywords` ORDER BY kwd_id LIMIT %d";
|
434 |
+
$result2 = $wpdb->get_results($wpdb->prepare($sql21, AHC_RECENT_KEYWORDS_LIMIT), OBJECT);
|
435 |
+
if($result2 !== false){
|
436 |
+
$ids2 = array();
|
437 |
+
foreach($result2 as $r){
|
438 |
+
$ids2[] = $r->kwd_id;
|
439 |
+
}
|
440 |
+
$ids2 = implode(',', $ids2);
|
441 |
+
$sql22 = "DELETE FROM `ahc_keywords`".((!empty($ids2))? " WHERE kwd_id NOT IN (".$ids2.")" : "");
|
442 |
+
|
443 |
+
if($wpdb->query($sql12) !== false){
|
444 |
+
return ($wpdb->query($sql22) !== false);
|
445 |
+
}
|
446 |
+
}
|
447 |
+
}
|
448 |
+
return false;
|
449 |
+
}
|
450 |
+
//--------------------------------------------
|
451 |
+
/**
|
452 |
+
* Update traffic by title table
|
453 |
+
*
|
454 |
+
* @uses wpdb::prepare()
|
455 |
+
* @uses wpdb::get_results()
|
456 |
+
* @uses wpdb::query()
|
457 |
+
*
|
458 |
+
* @param integer $til_page_id
|
459 |
+
* @param string $til_page_title
|
460 |
+
* @return boolean
|
461 |
+
*/
|
462 |
+
protected function updateTitleTraffic($til_page_id, $til_page_title){
|
463 |
+
global $wpdb;
|
464 |
+
$sql = "SELECT til_id FROM `ahc_title_traffic` where til_page_id = %s";
|
465 |
+
$result = $wpdb->get_results($wpdb->prepare($sql, $til_page_id), OBJECT);
|
466 |
+
if($result !== false){
|
467 |
+
if(!empty($result)){
|
468 |
+
$sql2 = "UPDATE `ahc_title_traffic`
|
469 |
+
SET til_hits = til_hits + 1, til_page_title = %s
|
470 |
+
WHERE til_id = %d";
|
471 |
+
return ($wpdb->query($wpdb->prepare($sql2, $til_page_title, $result[0]->til_id)) !== false);
|
472 |
+
} else{
|
473 |
+
$sql2 = "INSERT INTO `ahc_title_traffic` (til_page_id, til_page_title, til_hits)
|
474 |
+
VALUES(%s, %s, 1)";
|
475 |
+
return ($wpdb->query($wpdb->prepare($sql2, $til_page_id, $til_page_title)) !== false);
|
476 |
+
}
|
477 |
+
} else{
|
478 |
+
return false;
|
479 |
+
}
|
480 |
+
}
|
481 |
+
//--------------------------------------------
|
482 |
+
/**
|
483 |
+
* Update visitor's & visits' times table
|
484 |
+
*
|
485 |
+
* @uses wpdb::prepare()
|
486 |
+
* @uses wpdb::query()
|
487 |
+
*
|
488 |
+
* @param integer $visitors Optional
|
489 |
+
* @param integer $visits Optional
|
490 |
+
* @return boolean
|
491 |
+
*/
|
492 |
+
protected function updateVisitsTime($visitors = 0, $visits = 0){
|
493 |
+
global $wpdb;
|
494 |
+
$sql = "UPDATE `ahc_visits_time` SET vtm_visitors = vtm_visitors + %d, vtm_visits = vtm_visits + %d
|
495 |
+
WHERE TIME(vtm_time_from) <= TIME(NOW()) AND TIME(vtm_time_to) >= TIME(NOW())";
|
496 |
+
return ($wpdb->query($wpdb->prepare($sql, $visitors, $visits)) !== false);
|
497 |
+
}
|
498 |
+
//--------------------------------------------
|
499 |
+
/**
|
500 |
+
* Record (insert) the visit
|
501 |
+
*
|
502 |
+
* @uses wpdb::prepare()
|
503 |
+
* @uses wpdb::query()
|
504 |
+
*
|
505 |
+
* @return boolean
|
506 |
+
*/
|
507 |
+
protected function recordThisHits(){
|
508 |
+
global $wpdb;
|
509 |
+
$sql = "INSERT INTO `ahc_hits`
|
510 |
+
(`hit_ip_address`, `hit_user_agent`, `hit_request_uri`, `hit_page_id`, `hit_page_title`, `hit_referer`, `hit_referer_site`,
|
511 |
+
`srh_id`, `hit_search_words`, `bsr_id`, `hit_date`, `hit_time`)
|
512 |
+
VALUES (%s, %s, %s, %s, %s, %s, %s, %d, %s, %d, NOW(), NOW())";
|
513 |
+
$result = $wpdb->query($wpdb->prepare($sql, $this->ipAddress, $this->userAgent, $this->requestUri, $this->pageId, $this->pageTitle,
|
514 |
+
$this->referer, $this->refererSite, $this->searchEngine, $this->keyWords, $this->browser));
|
515 |
+
return ($result !== false);
|
516 |
+
}
|
517 |
+
//--------------------------------------------
|
518 |
+
}
|
519 |
+
?>
|
crawlers.php
ADDED
@@ -0,0 +1,37 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
function crawlerDetect($USER_AGENT)
|
3 |
+
{
|
4 |
+
$crawlers = array(
|
5 |
+
'Google' => 'Google',
|
6 |
+
'MSN' => 'msnbot',
|
7 |
+
'Rambler' => 'Rambler',
|
8 |
+
'Yahoo' => 'Yahoo',
|
9 |
+
'AbachoBOT' => 'AbachoBOT',
|
10 |
+
'accoona' => 'Accoona',
|
11 |
+
'AcoiRobot' => 'AcoiRobot',
|
12 |
+
'ASPSeek' => 'ASPSeek',
|
13 |
+
'CrocCrawler' => 'CrocCrawler',
|
14 |
+
'Dumbot' => 'Dumbot',
|
15 |
+
'FAST-WebCrawler' => 'FAST-WebCrawler',
|
16 |
+
'GeonaBot' => 'GeonaBot',
|
17 |
+
'Gigabot' => 'Gigabot',
|
18 |
+
'Lycos spider' => 'Lycos',
|
19 |
+
'MSRBOT' => 'MSRBOT',
|
20 |
+
'Altavista robot' => 'Scooter',
|
21 |
+
'AltaVista robot' => 'Altavista',
|
22 |
+
'ID-Search Bot' => 'IDBot',
|
23 |
+
'eStyle Bot' => 'eStyle',
|
24 |
+
'Scrubby robot' => 'Scrubby',
|
25 |
+
'Facebook' => 'facebookexternalhit',
|
26 |
+
);
|
27 |
+
// to get crawlers string used in function uncomment it
|
28 |
+
// it is better to save it in string than use implode every time
|
29 |
+
// global $crawlers
|
30 |
+
$crawlers_agents = implode('|',$crawlers);
|
31 |
+
if (strpos($crawlers_agents, $USER_AGENT) === false)
|
32 |
+
return false;
|
33 |
+
else {
|
34 |
+
return TRUE;
|
35 |
+
}
|
36 |
+
}
|
37 |
+
?>
|
css/ar_css.css
ADDED
@@ -0,0 +1,73 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
|
2 |
+
html {height: 100%}
|
3 |
+
body {height: 100%; margin:0; padding:0; overflow-x:hidden; font: 10px verdana;}
|
4 |
+
|
5 |
+
.ahc_main_container{
|
6 |
+
direction: rtl; /* ## */
|
7 |
+
padding: 60px 20px;
|
8 |
+
}
|
9 |
+
.rightPanelsContainer{float: right; /* ## */ margin: 0; padding: 0;}
|
10 |
+
.leftPanelsContainer{float: left; /* ## */ margin: 0; padding: 0;}
|
11 |
+
.cleaner{clear: both;}
|
12 |
+
.panel, .panelcollapsed{
|
13 |
+
background: #eee;
|
14 |
+
margin: 10px 0px;
|
15 |
+
padding: 0px 0px 5px;
|
16 |
+
-moz-border-radius: 4px;
|
17 |
+
-webkit-border-radius: 4px;
|
18 |
+
}
|
19 |
+
.panel h2, .panelcollapsed h2{
|
20 |
+
font-size: 18px;
|
21 |
+
font-weight: normal;
|
22 |
+
margin: 0px;
|
23 |
+
padding: 4px;
|
24 |
+
background: #FFF url(../images/arrow_up.png) no-repeat 1% 50%; /* ## */
|
25 |
+
border-bottom: 1px solid #CCC;
|
26 |
+
-moz-border-radius: 3px;
|
27 |
+
-webkit-border-radius: 3px;
|
28 |
+
border-top: 1px solid #FFF;
|
29 |
+
border-right: 1px solid #FFF;
|
30 |
+
border-left: 1px solid #FFF;
|
31 |
+
}
|
32 |
+
.panelcollapsed h2{
|
33 |
+
background: #FFF url(../images/arrow_down.png) no-repeat 1% 50%; /* ## */
|
34 |
+
border-color: #CCC;
|
35 |
+
}
|
36 |
+
.panelcontent{
|
37 |
+
padding: 10px;
|
38 |
+
background: #FFF;
|
39 |
+
}
|
40 |
+
.panelcollapsed .panelcontent {display: none;}
|
41 |
+
.panelcontent td, .panelcontent th{font-size: 14px; font-weight: 0; padding: 5px;}
|
42 |
+
.panelcontent td.values{text-align: center; color: #395A7C; font-size: 14px;}
|
43 |
+
|
44 |
+
.fineFont{font-size: 12px !important}
|
45 |
+
|
46 |
+
.lastVisitorsDetails{border-bottom: solid 1px #dad6ca; direction: ltr; padding: 5px;}
|
47 |
+
.lastVisitorsDetails span{margin-right: 3px;}
|
48 |
+
.lastVisitorsDetails img{vertical-align: middle;}
|
49 |
+
.ipAddress{float: left; font-size: 14px; color: #3B9EF9; margin-bottom: 10px; margin-bottom: 10px;}
|
50 |
+
.referingSite{color: #3B9EF9; margin-left: 5px; font-size: 12px;}
|
51 |
+
.visitDateTime{float: right; color: #3B9EF9; font-size: 12px;}
|
52 |
+
|
53 |
+
.lastSearchKeyWords, .visitorMarker{border-bottom: solid 1px #dad6ca; direction: ltr; padding: 5px;}
|
54 |
+
.lastSearchKeyWords span, .countryMarker span{margin-right: 3px;}
|
55 |
+
.lastSearchKeyWords img{vertical-align: middle;}
|
56 |
+
.countryMarker{direction: ltr; padding: 5px;}
|
57 |
+
.searchKeyWords{font-size: 14px;}
|
58 |
+
|
59 |
+
.languageChanger{direction: ltr; /* ## */ font-size: 18px;}
|
60 |
+
|
61 |
+
.countryMarker span.countryName, .visitorMarker span.ipAddress{margin-left: 5px;}
|
62 |
+
|
63 |
+
.visitorMarker{border-bottom: dashed 1px #dad6ca;}
|
64 |
+
.countryMarker span.countryName{font-size: 12px;}
|
65 |
+
.countryMarker img{vertical-align: middle;}
|
66 |
+
.visitorMarker span.ipAddress{font-size: 12px;}
|
67 |
+
.visitorMarker span{float: left;}
|
68 |
+
|
69 |
+
/* visitors graph begin */
|
70 |
+
div.visitorsGraphContainer{float: right; width: 70%} /* ### */
|
71 |
+
div.visitorsGraphContainer div.visitorsGraph{float: right; background-color: #82CE69; border-radius: 2px;}
|
72 |
+
div.visitorsPercent{float: right; width: 25%; margin-right: 5px;} /* ### */
|
73 |
+
/* visitors graph end */
|
css/en_css.css
ADDED
@@ -0,0 +1,117 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
body {font: 10px verdana; background:#F1F1F1 !important}
|
2 |
+
|
3 |
+
.legendsContainer{min-height: 410px; border: solid 1px #CCCCCC; border-radius: 5px; width:200px !important; padding: 10px; background-color: #F1F1F1;}
|
4 |
+
.legendsContainer div.legend{float: left;display:inline; height:auto; width:180px !important; margin: 0 10px 10px 0;}
|
5 |
+
div.legend span{font-size: 12px; line-height: 0.9;}
|
6 |
+
div.legend span.color{display: block; float: left; width: 15px; height: 95%; margin-right: 8px;}
|
7 |
+
div.legend span.name{margin-right: 5px;}
|
8 |
+
div.legend span.value{color: #D34E4E;}
|
9 |
+
.panel{
|
10 |
+
margin-left:20px
|
11 |
+
}
|
12 |
+
|
13 |
+
.disabled_panel{
|
14 |
+
background:#666;
|
15 |
+
position:absolute
|
16 |
+
|
17 |
+
}
|
18 |
+
|
19 |
+
.ahc_main_container{
|
20 |
+
direction: ltr; /* ## */
|
21 |
+
font-family:Verdana, Geneva, sans-serif; font-size:8px !important;
|
22 |
+
width:98%;
|
23 |
+
}
|
24 |
+
.ahc_main_container h1{
|
25 |
+
font-size:20px;
|
26 |
+
font-weight:normal;
|
27 |
+
color:#657f97;
|
28 |
+
|
29 |
+
}
|
30 |
+
.hitsLogo{
|
31 |
+
background:url(../images/hitslogo.png) left no-repeat;
|
32 |
+
height:55px;
|
33 |
+
width:55px;
|
34 |
+
display:inline;
|
35 |
+
float:left;
|
36 |
+
}
|
37 |
+
.rightPanelsContainer{float: left; /* ## */ margin: 0; padding: 0;}
|
38 |
+
.leftPanelsContainer{float: right; /* ## */ margin: 0; padding: 0;}
|
39 |
+
.cleaner{clear: both;}
|
40 |
+
.panel, .panelcollapsed{
|
41 |
+
background: #eee;
|
42 |
+
border:#dfdfdf solid 1px;
|
43 |
+
margin: 10px 0px;
|
44 |
+
padding: 0px 0px 5px;
|
45 |
+
-moz-border-radius: 4px;
|
46 |
+
-webkit-border-radius: 4px;
|
47 |
+
|
48 |
+
}
|
49 |
+
.panel h2, .panelcollapsed h2{
|
50 |
+
font-size: 12px !important;
|
51 |
+
font-weight: normal !important;
|
52 |
+
margin: 0px !important;
|
53 |
+
|
54 |
+
background-color:#666 !important;
|
55 |
+
padding-top:10px !important;
|
56 |
+
padding-left:7px !important;
|
57 |
+
color: #657f97 !important;
|
58 |
+
font-weight:bold !important;
|
59 |
+
padding: 4px !important;
|
60 |
+
background: url(../images/myheaderbg.png) repeat-x !important; /* ## */
|
61 |
+
|
62 |
+
-moz-border-radius: 3px !important;
|
63 |
+
-webkit-border-radius: 3px !important;
|
64 |
+
height:20px !important;
|
65 |
+
}
|
66 |
+
.panelcollapsed h2{
|
67 |
+
background: #FFF url(../images/arrow_down.png) no-repeat 99% 50% !important;; /* ## */
|
68 |
+
border-color: #CCC !important;;
|
69 |
+
}
|
70 |
+
.panelcontent{
|
71 |
+
padding: 10px;
|
72 |
+
background: #FFF;
|
73 |
+
min-height:400px;
|
74 |
+
}
|
75 |
+
.panelcollapsed .panelcontent {display: none;}
|
76 |
+
.panelcontent th{font-size: 12px; color: #657f97; font-weight: 0; padding: 5px; text-align: left; border-bottom:#CCC solid 1px; }
|
77 |
+
.panelcontent td, .panelcontent td.values{text-align: left; color:#000; font-size: 12px; font-weight: 0; padding: 5px; text-align: left; border-bottom:#EFEFEF solid 1px}
|
78 |
+
.panelcontent tr:hover{
|
79 |
+
background:#F5F5F5
|
80 |
+
}
|
81 |
+
|
82 |
+
.fineFont{font-size: 10px !important}
|
83 |
+
|
84 |
+
.lastVisitorsDetails{border-bottom: solid 1px #dad6ca; direction: ltr; padding: 5px;}
|
85 |
+
.lastVisitorsDetails span{margin-right: 3px;}
|
86 |
+
.lastVisitorsDetails img{vertical-align: middle;}
|
87 |
+
.ipAddress{float: left; font-size: 14px; color: #3B9EF9; margin-bottom: 10px; margin-bottom: 10px;}
|
88 |
+
.referingSite{color: #3B9EF9; margin-left: 5px; font-size: 12px;}
|
89 |
+
.visitDateTime{float: right; color: #3B9EF9; font-size: 12px;}
|
90 |
+
|
91 |
+
.lastSearchKeyWords, .visitorMarker{border-bottom: solid 1px #dad6ca; direction: ltr; padding: 5px;}
|
92 |
+
.lastSearchKeyWords span, .countryMarker span{margin-right: 3px;}
|
93 |
+
.lastSearchKeyWords img{vertical-align: middle;}
|
94 |
+
.countryMarker{direction: ltr; padding: 5px;}
|
95 |
+
.searchKeyWords{font-size: 14px;}
|
96 |
+
|
97 |
+
.languageChanger{direction: rtl; /* ## */ font-size: 18px;}
|
98 |
+
|
99 |
+
.countryMarker span.countryName, .visitorMarker span.ipAddress{margin-left: 5px;}
|
100 |
+
|
101 |
+
.visitorMarker{border-bottom: dashed 1px #dad6ca;}
|
102 |
+
.countryMarker span.countryName{font-size: 12px;}
|
103 |
+
.countryMarker img{vertical-align: middle;}
|
104 |
+
.visitorMarker span.ipAddress{font-size: 12px;}
|
105 |
+
.visitorMarker span{float: left;}
|
106 |
+
|
107 |
+
/* visitors graph begin */
|
108 |
+
div.visitorsGraphContainer{float: left; width: 70%} /* ### */
|
109 |
+
div.visitorsGraphContainer div.visitorsGraph{float: left; background-color: #82CE69; border-radius: 2px;}
|
110 |
+
div.visitorsPercent{float: left; width: 25%; margin-left: 5px;} /* ### */
|
111 |
+
/* visitors graph end */
|
112 |
+
|
113 |
+
h2{
|
114 |
+
text-align:left !important;
|
115 |
+
font-size:14px !important;
|
116 |
+
height:30px !important;
|
117 |
+
}
|
css/en_newcss.css
ADDED
@@ -0,0 +1,115 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
body {font: 10px verdana; background:#F1F1F1 !important}
|
2 |
+
|
3 |
+
.legendsContainer{min-height: 410px; border: solid 1px #CCCCCC; border-radius: 5px; width:200px !important; padding: 10px; background-color: #F1F1F1;}
|
4 |
+
.legendsContainer div.legend{float: left;display:inline; height:auto; width:180px !important; margin: 0 10px 10px 0;}
|
5 |
+
div.legend span{font-size: 12px; line-height: 0.9;}
|
6 |
+
div.legend span.color{display: block; float: left; width: 15px; height: 95%; margin-right: 8px;}
|
7 |
+
div.legend span.name{margin-right: 5px;}
|
8 |
+
div.legend span.value{color: #D34E4E;}
|
9 |
+
.panel{
|
10 |
+
margin-left:20px
|
11 |
+
}
|
12 |
+
|
13 |
+
.disabled_panel{
|
14 |
+
background:#666;
|
15 |
+
position:absolute
|
16 |
+
|
17 |
+
}
|
18 |
+
|
19 |
+
.ahc_main_container{
|
20 |
+
direction: ltr; /* ## */
|
21 |
+
font-family:Verdana, Geneva, sans-serif; font-size:8px !important;
|
22 |
+
width:98%;
|
23 |
+
}
|
24 |
+
.ahc_main_container h1{
|
25 |
+
font-size:20px;
|
26 |
+
font-weight:normal;
|
27 |
+
color:#657f97;
|
28 |
+
|
29 |
+
}
|
30 |
+
.hitsLogo{
|
31 |
+
background:url(../images/hitslogo.png) left no-repeat;
|
32 |
+
height:55px;
|
33 |
+
width:55px;
|
34 |
+
display:inline;
|
35 |
+
float:left;
|
36 |
+
}
|
37 |
+
.rightPanelsContainer{float: left; /* ## */ margin: 0; padding: 0;}
|
38 |
+
.leftPanelsContainer{float: right; /* ## */ margin: 0; padding: 0;}
|
39 |
+
.cleaner{clear: both;}
|
40 |
+
.panel, .panelcollapsed{
|
41 |
+
background: #23282D;
|
42 |
+
border:#23282D solid 1px;
|
43 |
+
margin: 10px 0px;
|
44 |
+
-moz-border-radius: 4px;
|
45 |
+
-webkit-border-radius: 4px;
|
46 |
+
|
47 |
+
}
|
48 |
+
.panel h2, .panelcollapsed h2{
|
49 |
+
font-size: 12px !important;
|
50 |
+
font-weight: normal !important;
|
51 |
+
margin: 0px !important;
|
52 |
+
|
53 |
+
background-color:#666 !important;
|
54 |
+
padding:5px !important;
|
55 |
+
|
56 |
+
color: white !important;
|
57 |
+
font-weight:bold !important;
|
58 |
+
background-color:#23282D;
|
59 |
+
|
60 |
+
-moz-border-radius: 3px !important;
|
61 |
+
-webkit-border-radius: 3px !important;
|
62 |
+
height:20px !important;
|
63 |
+
}
|
64 |
+
.panelcollapsed h2{
|
65 |
+
background: #FFF url(../images/arrow_down.png) no-repeat 99% 50% !important;; /* ## */
|
66 |
+
border-color: #CCC !important;;
|
67 |
+
}
|
68 |
+
.panelcontent{
|
69 |
+
padding: 10px;
|
70 |
+
background: #FFF;
|
71 |
+
min-height:400px;
|
72 |
+
}
|
73 |
+
.panelcollapsed .panelcontent {display: none;}
|
74 |
+
.panelcontent th{font-size: 12px; color: #657f97; font-weight: 0; padding: 5px; text-align: left; border-bottom:#CCC solid 1px; }
|
75 |
+
.panelcontent td, .panelcontent td.values{text-align: left; color:#000; font-size: 12px; font-weight: 0; padding: 5px; text-align: left; border-bottom:#EFEFEF solid 1px}
|
76 |
+
.panelcontent tr:hover{
|
77 |
+
background:#F5F5F5
|
78 |
+
}
|
79 |
+
|
80 |
+
.fineFont{font-size: 10px !important}
|
81 |
+
|
82 |
+
.lastVisitorsDetails{border-bottom: solid 1px #dad6ca; direction: ltr; padding: 5px;}
|
83 |
+
.lastVisitorsDetails span{margin-right: 3px;}
|
84 |
+
.lastVisitorsDetails img{vertical-align: middle;}
|
85 |
+
.ipAddress{float: left; font-size: 14px; color: #3B9EF9; margin-bottom: 10px; margin-bottom: 10px;}
|
86 |
+
.referingSite{color: #3B9EF9; margin-left: 5px; font-size: 12px;}
|
87 |
+
.visitDateTime{float: right; color: #3B9EF9; font-size: 12px;}
|
88 |
+
|
89 |
+
.lastSearchKeyWords, .visitorMarker{border-bottom: solid 1px #dad6ca; direction: ltr; padding: 5px;}
|
90 |
+
.lastSearchKeyWords span, .countryMarker span{margin-right: 3px;}
|
91 |
+
.lastSearchKeyWords img{vertical-align: middle;}
|
92 |
+
.countryMarker{direction: ltr; padding: 5px;}
|
93 |
+
.searchKeyWords{font-size: 14px;}
|
94 |
+
|
95 |
+
.languageChanger{direction: rtl; /* ## */ font-size: 18px;}
|
96 |
+
|
97 |
+
.countryMarker span.countryName, .visitorMarker span.ipAddress{margin-left: 5px;}
|
98 |
+
|
99 |
+
.visitorMarker{border-bottom: dashed 1px #dad6ca;}
|
100 |
+
.countryMarker span.countryName{font-size: 12px;}
|
101 |
+
.countryMarker img{vertical-align: middle;}
|
102 |
+
.visitorMarker span.ipAddress{font-size: 12px;}
|
103 |
+
.visitorMarker span{float: left;}
|
104 |
+
|
105 |
+
/* visitors graph begin */
|
106 |
+
div.visitorsGraphContainer{float: left; width: 70%} /* ### */
|
107 |
+
div.visitorsGraphContainer div.visitorsGraph{float: left; background-color: #82CE69; border-radius: 2px;}
|
108 |
+
div.visitorsPercent{float: left; width: 25%; margin-left: 5px;} /* ### */
|
109 |
+
/* visitors graph end */
|
110 |
+
|
111 |
+
h2{
|
112 |
+
text-align:left !important;
|
113 |
+
font-size:14px !important;
|
114 |
+
height:30px !important;
|
115 |
+
}
|
database_basics_data.php
ADDED
@@ -0,0 +1,265 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
$internetCountryCodes = array(
|
3 |
+
'A1' => 'Anonymous Proxy', 'A2' => 'Satellite Provider', 'O1' => 'Other Country', 'AD' => 'Andorra',
|
4 |
+
'AE' => 'United Arab Emirates', 'AF' => 'Afghanistan', 'AG' => 'Antigua and Barbuda', 'AI' => 'Anguilla',
|
5 |
+
'AL' => 'Albania', 'AM' => 'Armenia', 'AN' => 'Netherlands Antilles ', 'AO' => 'Angola',
|
6 |
+
'AP' => 'Asia/Pacific Region', 'AQ' => 'Antarctica', 'AR' => 'Argentina', 'AS' => 'American Samoa',
|
7 |
+
'AT' => 'Austria', 'AU' => 'Australia', 'AW' => 'Aruba', 'AX' => 'Aland Islands', 'AZ' => 'Azerbaijan',
|
8 |
+
'BA' => 'Bosnia and Herzegovina', 'BB' => 'Barbados', 'BD' => 'Bangladesh', 'BE' => 'Belgium',
|
9 |
+
'BF' => 'Burkina Faso', 'BG' => 'Bulgaria', 'BH' => 'Bahrain', 'BI' => 'Burundi',
|
10 |
+
'BJ' => 'Benin', 'BL' => 'Saint Bartelemey', 'BM' => 'Bermuda', 'BN' => 'Brunei Darussalam',
|
11 |
+
'BO' => 'Bolivia', 'BQ' => 'Bonaire', 'BR' => 'Brazil', 'BS' => 'Bahamas',
|
12 |
+
'BT' => 'Bhutan', 'BV' => 'Bouvet Island', 'BW' => 'Botswana', 'BY' => 'Belarus',
|
13 |
+
'BZ' => 'Belize', 'CA' => 'Canada', 'CC' => 'Cocos (Keeling) Islands', 'CD' => 'Congo',
|
14 |
+
'CF' => 'Central African Republic', 'CG' => 'Congo', 'CH' => 'Switzerland', 'CI' => 'Cote d\'Ivoire',
|
15 |
+
'CK' => 'Cook Islands', 'CL' => 'Chile', 'CM' => 'Cameroon', 'CN' => 'China',
|
16 |
+
'CO' => 'Colombia', 'CR' => 'Costa Rica', 'CU' => 'Cuba', 'CV' => 'Cape Verde',
|
17 |
+
'CW' => 'Curacao', 'CX' => 'Christmas Island', 'CY' => 'Cyprus', 'CZ' => 'Czech Republic',
|
18 |
+
'DE' => 'Germany', 'DJ' => 'Djibouti', 'DK' => 'Denmark', 'DM' => 'Dominica',
|
19 |
+
'DO' => 'Dominican Republic', 'DZ' => 'Algeria', 'EC' => 'Ecuador', 'EE' => 'Estonia',
|
20 |
+
'EG' => 'Egypt', 'EH' => 'Western Sahara', 'ER' => 'Eritrea', 'ES' => 'Spain',
|
21 |
+
'ET' => 'Ethiopia', 'EU' => 'Europe', 'FI' => 'Finland', 'FJ' => 'Fiji',
|
22 |
+
'FK' => 'Falkland Islands (Malvinas)', 'FM' => 'Micronesia', 'FO' => 'Faroe Islands', 'FR' => 'France',
|
23 |
+
'GA' => 'Gabon', 'GB' => 'United Kingdom', 'GD' => 'Grenada', 'GE' => 'Georgia',
|
24 |
+
'GF' => 'French Guiana', 'GG' => 'Guernsey', 'GH' => 'Ghana', 'GI' => 'Gibraltar',
|
25 |
+
'GL' => 'Greenland', 'GM' => 'Gambia', 'GN' => 'Guinea', 'GP' => 'Guadeloupe',
|
26 |
+
'GQ' => 'Equatorial Guinea', 'GR' => 'Greece', 'GS' => 'South Georgia and the South Sandwich Islands', 'GT' => 'Guatemala',
|
27 |
+
'GU' => 'Guam', 'GW' => 'Guinea-Bissau', 'GY' => 'Guyana', 'HK' => 'Hong Kong',
|
28 |
+
'HM' => 'Heard Island and McDonald Islands', 'HN' => 'Honduras', 'HR' => 'Croatia', 'HT' => 'Haiti',
|
29 |
+
'HU' => 'Hungary', 'ID' => 'Indonesia', 'IE' => 'Ireland', 'IL' => 'Israel',
|
30 |
+
'IM' => 'Isle of Man', 'IN' => 'India', 'IO' => 'British Indian Ocean Territory', 'IQ' => 'Iraq',
|
31 |
+
'IR' => 'Iran', 'IS' => 'Iceland', 'IT' => 'Italy', 'JE' => 'Jersey',
|
32 |
+
'JM' => 'Jamaica', 'JO' => 'Jordan', 'JP' => 'Japan', 'KE' => 'Kenya',
|
33 |
+
'KG' => 'Kyrgyzstan', 'KH' => 'Cambodia', 'KI' => 'Kiribati', 'KM' => 'Comoros',
|
34 |
+
'KN' => 'Saint Kitts and Nevis', 'KP' => 'Korea', 'KR' => 'Korea', 'KW' => 'Kuwait',
|
35 |
+
'KY' => 'Cayman Islands', 'KZ' => 'Kazakhstan', 'LA' => 'Lao People\'s Democratic Republic', 'LB' => 'Lebanon',
|
36 |
+
'LC' => 'Saint Lucia', 'LI' => 'Liechtenstein', 'LK' => 'Sri Lanka', 'LR' => 'Liberia',
|
37 |
+
'LS' => 'Lesotho', 'LT' => 'Lithuania', 'LU' => 'Luxembourg', 'LV' => 'Latvia',
|
38 |
+
'LY' => 'Libyan Arab Jamahiriya', 'MA' => 'Morocco', 'MC' => 'Monaco', 'MD' => 'Moldova',
|
39 |
+
'ME' => 'Montenegro', 'MF' => 'Saint Martin', 'MG' => 'Madagascar', 'MH' => 'Marshall Islands',
|
40 |
+
'MK' => 'Macedonia', 'ML' => 'Mali', 'MM' => 'Myanmar', 'MN' => 'Mongolia',
|
41 |
+
'MO' => 'Macao', 'MP' => 'Northern Mariana Islands', 'MQ' => 'Martinique', 'MR' => 'Mauritania',
|
42 |
+
'MS' => 'Montserrat', 'MT' => 'Malta', 'MU' => 'Mauritius', 'MV' => 'Maldives',
|
43 |
+
'MW' => 'Malawi', 'MX' => 'Mexico', 'MY' => 'Malaysia', 'MZ' => 'Mozambique',
|
44 |
+
'NA' => 'Namibia', 'NC' => 'New Caledonia', 'NE' => 'Niger', 'NF' => 'Norfolk Island',
|
45 |
+
'NG' => 'Nigeria', 'NI' => 'Nicaragua', 'NL' => 'Netherlands', 'NO' => 'Norway',
|
46 |
+
'NP' => 'Nepal', 'NR' => 'Nauru', 'NU' => 'Niue', 'NZ' => 'New Zealand',
|
47 |
+
'OM' => 'Oman', 'PA' => 'Panama', 'PE' => 'Peru', 'PF' => 'French Polynesia',
|
48 |
+
'PG' => 'Papua New Guinea', 'PH' => 'Philippines', 'PK' => 'Pakistan', 'PL' => 'Poland',
|
49 |
+
'PM' => 'Saint Pierre and Miquelon', 'PN' => 'Pitcairn', 'PR' => 'Puerto Rico', 'PS' => 'Palestinian Territory',
|
50 |
+
'PT' => 'Portugal', 'PW' => 'Palau', 'PY' => 'Paraguay', 'QA' => 'Qatar',
|
51 |
+
'RE' => 'Reunion', 'RO' => 'Romania', 'RS' => 'Serbia', 'RU' => 'Russian Federation',
|
52 |
+
'RW' => 'Rwanda', 'SA' => 'Saudi Arabia', 'SB' => 'Solomon Islands', 'SC' => 'Seychelles',
|
53 |
+
'SD' => 'Sudan', 'SE' => 'Sweden', 'SG' => 'Singapore', 'SH' => 'Saint Helena',
|
54 |
+
'SI' => 'Slovenia', 'SJ' => 'Svalbard and Jan Mayen', 'SK' => 'Slovakia', 'SL' => 'Sierra Leone',
|
55 |
+
'SM' => 'San Marino', 'SN' => 'Senegal', 'SO' => 'Somalia', 'SR' => 'Suriname',
|
56 |
+
'SS' => 'South Sudan', 'ST' => 'Sao Tome and Principe', 'SV' => 'El Salvador', 'SX' => 'Sint Maarten',
|
57 |
+
'SY' => 'Syrian Arab Republic', 'SZ' => 'Swaziland', 'TC' => 'Turks and Caicos Islands', 'TD' => 'Chad',
|
58 |
+
'TF' => 'French Southern Territories', 'TG' => 'Togo', 'TH' => 'Thailand', 'TJ' => 'Tajikistan',
|
59 |
+
'TK' => 'Tokelau', 'TL' => 'Timor-Leste', 'TM' => 'Turkmenistan', 'TN' => 'Tunisia',
|
60 |
+
'TO' => 'Tonga', 'TR' => 'Turkey', 'TT' => 'Trinidad and Tobago', 'TV' => 'Tuvalu',
|
61 |
+
'TW' => 'Taiwan', 'TZ' => 'Tanzania', 'UA' => 'Ukraine', 'UG' => 'Uganda',
|
62 |
+
'UM' => 'United States Minor Outlying Islands', 'US' => 'United States', 'UY' => 'Uruguay', 'UZ' => 'Uzbekistan',
|
63 |
+
'VA' => 'Holy See (Vatican City State)', 'VC' => 'Saint Vincent and the Grenadines', 'VE' => 'Venezuela', 'VG' => 'Virgin Islands',
|
64 |
+
'VI' => 'Virgin Islands', 'VN' => 'Vietnam', 'VU' => 'Vanuatu', 'WF' => 'Wallis and Futuna',
|
65 |
+
'WS' => 'Samoa', 'YE' => 'Yemen', 'YT' => 'Mayotte', 'ZA' => 'South Africa', 'ZM' => 'Zambia',
|
66 |
+
'ZR' => 'Zaire', 'ZW' => 'Zimbabwe', 'XX' => 'Anonymous Proxy'
|
67 |
+
);
|
68 |
+
|
69 |
+
$contriesLatLng = array(
|
70 |
+
'AD' => array('42.5000', '1.5000'), 'AE' => array('24.0000', '54.0000'), 'AF' => array('33.0000', '65.0000'),
|
71 |
+
'AG' => array('17.0500', '-61.8000'), 'AI' => array('18.2500', '-63.1667'), 'AL' => array('41.0000', '20.0000'),
|
72 |
+
'AM' => array('40.0000', '45.0000'), 'AN' => array('12.2500', '-68.7500'), 'AO' => array('-12.5000', '18.5000'),
|
73 |
+
'AP' => array('35.0000', '105.0000'), 'AQ' => array('-90.0000', '0.0000'), 'AR' => array('-34.0000', '-64.0000'),
|
74 |
+
'AS' => array('-14.3333', '-170.0000'), 'AT' => array('47.3333', '13.3333'), 'AU' => array('-27.0000', '133.0000'),
|
75 |
+
'AW' => array('12.5000', '-69.9667'), 'AX' => array('60.178525', '19.91561'), 'AZ' => array('40.5000', '47.5000'),
|
76 |
+
'BA' => array('44.0000', '18.0000'), 'BB' => array('13.1667', '-59.5333'), 'BD' => array('24.0000', '90.0000'),
|
77 |
+
'BE' => array('50.8333', '4.0000'), 'BF' => array('13.0000', '-2.0000'), 'BG' => array('43.0000', '25.0000'),
|
78 |
+
'BH' => array('26.0000', '50.5500'), 'BI' => array('-3.5000', '30.0000'), 'BJ' => array('9.5000', '2.2500'),
|
79 |
+
'BM' => array('32.3333', '-64.7500'), 'BN' => array('4.5000', '114.6667'), 'BL' => array('17.9', '-62.833333'),
|
80 |
+
'BO' => array('-17.0000', '-65.0000'), 'BQ' => array('12.178361', '-68.238534'), 'BR' => array('-10.0000', '-55.0000'),
|
81 |
+
'BS' => array('24.2500', '-76.0000'), 'BT' => array('27.5000', '90.5000'), 'BV' => array('-54.4333', '3.4000'),
|
82 |
+
'BW' => array('-22.0000', '24.0000'), 'BY' => array('53.0000', '28.0000'), 'BZ' => array('17.2500', '-88.7500'),
|
83 |
+
'CA' => array('60.0000', '-95.0000'), 'CC' => array('-12.5000', '96.8333'), 'CD' => array('0.0000', '25.0000'),
|
84 |
+
'CF' => array('7.0000', '21.0000'), 'CG' => array('-1.0000', '15.0000'), 'CH' => array('47.0000', '8.0000'),
|
85 |
+
'CI' => array('8.0000', '-5.0000'), 'CK' => array('-21.2333', '-159.7667'), 'CL' => array('-30.0000', '-71.0000'),
|
86 |
+
'CM' => array('6.0000', '12.0000'), 'CN' => array('35.0000', '105.0000'), 'CO' => array('4.0000', '-72.0000'),
|
87 |
+
'CR' => array('10.0000', '-84.0000'), 'CU' => array('21.5000', '-80.0000'), 'CW' => array('12.16957', '-68.99002'),
|
88 |
+
'CV' => array('16.0000', '-24.0000'), 'CX' => array('-10.5000', '105.6667'), 'CY' => array('35.0000', '33.0000'),
|
89 |
+
'CZ' => array('49.7500', '15.5000'), 'DE' => array('51.0000', '9.0000'), 'DJ' => array('11.5000', '43.0000'),
|
90 |
+
'DK' => array('56.0000', '10.0000'), 'DM' => array('15.4167', '-61.3333'), 'DO' => array('19.0000', '-70.6667'),
|
91 |
+
'DZ' => array('28.0000', '3.0000'), 'EC' => array('-2.0000', '-77.5000'), 'EE' => array('59.0000', '26.0000'),
|
92 |
+
'EG' => array('27.0000', '30.0000'), 'EH' => array('24.5000', '-13.0000'), 'ER' => array('15.0000', '39.0000'),
|
93 |
+
'ES' => array('40.0000', '-4.0000'), 'ET' => array('8.0000', '38.0000'), 'EU' => array('47.0000', '8.0000'),
|
94 |
+
'FI' => array('64.0000', '26.0000'), 'FJ' => array('-18.0000', '175.0000'), 'FK' => array('-51.7500', '-59.0000'),
|
95 |
+
'FM' => array('6.9167', '158.2500'), 'FO' => array('62.0000', '-7.0000'), 'FR' => array('46.0000', '2.0000'),
|
96 |
+
'GA' => array('-1.0000', '11.7500'), 'GB' => array('54.0000', '-2.0000'), 'GD' => array('12.1167', '-61.6667'),
|
97 |
+
'GE' => array('42.0000', '43.5000'), 'GF' => array('4.0000', '-53.0000'), 'GH' => array('8.0000', '-2.0000'),
|
98 |
+
'GG' => array('49.465691', '-2.585278'), 'GI' => array('36.1833', '-5.3667'), 'GL' => array('72.0000', '-40.0000'),
|
99 |
+
'GM' => array('13.4667', '-16.5667'), 'GN' => array('11.0000', '-10.0000'), 'GP' => array('16.2500', '-61.5833'),
|
100 |
+
'GQ' => array('2.0000', '10.0000'), 'GR' => array('39.0000', '22.0000'), 'GS' => array('-54.5000', '-37.0000'),
|
101 |
+
'GT' => array('15.5000', '-90.2500'), 'GU' => array('13.4667', '144.7833'), 'GW' => array('12.0000', '-15.0000'),
|
102 |
+
'GY' => array('5.0000', '-59.0000'), 'HK' => array('22.2500', '114.1667'), 'HM' => array('-53.1000', '72.5167'),
|
103 |
+
'HN' => array('15.0000', '-86.5000'), 'HR' => array('45.1667', '15.5000'), 'HT' => array('19.0000', '-72.4167'),
|
104 |
+
'HU' => array('47.0000', '20.0000'), 'ID' => array('-5.0000', '120.0000'), 'IE' => array('53.0000', '-8.0000'),
|
105 |
+
'IL' => array('31.5000', '34.7500'), 'IM' => array('54.236107', '-4.548056'), 'IN' => array('20.0000', '77.0000'),
|
106 |
+
'IO' => array('-6.0000', '71.5000'), 'IQ' => array('33.0000', '44.0000'), 'IR' => array('32.0000', '53.0000'),
|
107 |
+
'IS' => array('65.0000', '-18.0000'), 'IT' => array('42.8333', '12.8333'), 'JE' => array('49.214439', '-2.13125'),
|
108 |
+
'JM' => array('18.2500', '-77.5000'), 'JO' => array('31.0000', '36.0000'), 'JP' => array('36.0000', '138.0000'),
|
109 |
+
'KE' => array('1.0000', '38.0000'), 'KG' => array('41.0000', '75.0000'), 'KH' => array('13.0000', '105.0000'),
|
110 |
+
'KI' => array('1.4167', '173.0000'), 'KM' => array('-12.1667', '44.2500'), 'KN' => array('17.3333', '-62.7500'),
|
111 |
+
'KP' => array('40.0000', '127.0000'), 'KR' => array('37.0000', '127.5000'), 'KW' => array('29.3375', '47.6581'),
|
112 |
+
'KY' => array('19.5000', '-80.5000'), 'KZ' => array('48.0000', '68.0000'), 'LA' => array('18.0000', '105.0000'),
|
113 |
+
'LB' => array('33.8333', '35.8333'), 'LC' => array('13.8833', '-61.1333'), 'LI' => array('47.1667', '9.5333'),
|
114 |
+
'LK' => array('7.0000', '81.0000'), 'LR' => array('6.5000', '-9.5000'), 'LS' => array('-29.5000', '28.5000'),
|
115 |
+
'LT' => array('56.0000', '24.0000'), 'LU' => array('49.7500', '6.1667'), 'LV' => array('57.0000', '25.0000'),
|
116 |
+
'LY' => array('25.0000', '17.0000'), 'MA' => array('32.0000', '-5.0000'), 'MC' => array('43.7333', '7.4000'),
|
117 |
+
'MD' => array('47.0000', '29.0000'), 'ME' => array('42.0000', '19.0000'), 'MF' => array('18.08255', '-63.052251'),
|
118 |
+
'MG' => array('-20.0000', '47.0000'), 'MH' => array('9.0000', '168.0000'), 'MK' => array('41.8333', '22.0000'),
|
119 |
+
'ML' => array('17.0000', '-4.0000'), 'MM' => array('22.0000', '98.0000'), 'MN' => array('46.0000', '105.0000'),
|
120 |
+
'MO' => array('22.1667', '113.5500'), 'MP' => array('15.2000', '145.7500'), 'MQ' => array('14.6667', '-61.0000'),
|
121 |
+
'MR' => array('20.0000', '-12.0000'), 'MS' => array('16.7500', '-62.2000'), 'MT' => array('35.8333', '14.5833'),
|
122 |
+
'MU' => array('-20.2833', '57.5500'), 'MV' => array('3.2500', '73.0000'), 'MW' => array('-13.5000', '34.0000'),
|
123 |
+
'MX' => array('23.0000', '-102.0000'), 'MY' => array('2.5000', '112.5000'), 'MZ' => array('-18.2500', '35.0000'),
|
124 |
+
'NA' => array('-22.0000', '17.0000'), 'NC' => array('-21.5000', '165.5000'), 'NE' => array('16.0000', '8.0000'),
|
125 |
+
'NF' => array('-29.0333', '167.9500'), 'NG' => array('10.0000', '8.0000'), 'NI' => array('13.0000', '-85.0000'),
|
126 |
+
'NL' => array('52.5000', '5.7500'), 'NO' => array('62.0000', '10.0000'), 'NP' => array('28.0000', '84.0000'),
|
127 |
+
'NR' => array('-0.5333', '166.9167'), 'NU' => array('-19.0333', '-169.8667'), 'NZ' => array('-41.0000', '174.0000'),
|
128 |
+
'OM' => array('21.0000', '57.0000'), 'PA' => array('9.0000', '-80.0000'), 'PE' => array('-10.0000', '-76.0000'),
|
129 |
+
'PF' => array('-15.0000', '-140.0000'), 'PG' => array('-6.0000', '147.0000'), 'PH' => array('13.0000', '122.0000'),
|
130 |
+
'PK' => array('30.0000', '70.0000'), 'PL' => array('52.0000', '20.0000'), 'PM' => array('46.8333', '-56.3333'),
|
131 |
+
'PN' => array('-24.376766', '-128.324339'), 'PR' => array('18.2500', '-66.5000'), 'PS' => array('32.0000', '35.2500'),
|
132 |
+
'PT' => array('39.5000', '-8.0000'), 'PW' => array('7.5000', '134.5000'), 'PY' => array('-23.0000', '-58.0000'),
|
133 |
+
'QA' => array('25.5000', '51.2500'), 'RE' => array('-21.1000', '55.6000'), 'RO' => array('46.0000', '25.0000'),
|
134 |
+
'RS' => array('44.0000', '21.0000'), 'RU' => array('60.0000', '100.0000'), 'RW' => array('-2.0000', '30.0000'),
|
135 |
+
'SA' => array('25.0000', '45.0000'), 'SB' => array('-8.0000', '159.0000'), 'SC' => array('-4.5833', '55.6667'),
|
136 |
+
'SD' => array('15.0000', '30.0000'), 'SE' => array('62.0000', '15.0000'), 'SG' => array('1.3667', '103.8000'),
|
137 |
+
'SH' => array('-15.9333', '-5.7000'), 'SI' => array('46.0000', '15.0000'), 'SJ' => array('78.0000', '20.0000'),
|
138 |
+
'SK' => array('48.6667', '19.5000'), 'SL' => array('8.5000', '-11.5000'), 'SM' => array('43.7667', '12.4167'),
|
139 |
+
'SS' => array('6.876992', '31.306979'), 'SN' => array('14.0000', '-14.0000'), 'SO' => array('10.0000', '49.0000'),
|
140 |
+
'SR' => array('4.0000', '-56.0000'), 'ST' => array('1.0000', '7.0000'), 'SV' => array('13.8333', '-88.9167'),
|
141 |
+
'SX' => array('18.041216', '-63.053073'), 'SY' => array('35.0000', '38.0000'), 'SZ' => array('-26.5000', '31.5000'),
|
142 |
+
'TC' => array('21.7500', '-71.5833'), 'TD' => array('15.0000', '19.0000'), 'TF' => array('-43.0000', '67.0000'),
|
143 |
+
'TG' => array('8.0000', '1.1667'), 'TH' => array('15.0000', '100.0000'), 'TJ' => array('39.0000', '71.0000'),
|
144 |
+
'TK' => array('-9.0000', '-172.0000'), 'TL' => array('-8.874217', '125.727539'), 'TM' => array('40.0000', '60.0000'),
|
145 |
+
'TN' => array('34.0000', '9.0000'), 'TO' => array('-20.0000', '-175.0000'), 'TR' => array('39.0000', '35.0000'),
|
146 |
+
'TT' => array('11.0000', '-61.0000'), 'TV' => array('-8.0000', '178.0000'), 'TW' => array('23.5000', '121.0000'),
|
147 |
+
'TZ' => array('-6.0000', '35.0000'), 'UA' => array('49.0000', '32.0000'), 'UG' => array('1.0000', '32.0000'),
|
148 |
+
'UM' => array('19.2833', '166.6000'), 'US' => array('38.0000', '-97.0000'), 'UY' => array('-33.0000', '-56.0000'),
|
149 |
+
'UZ' => array('41.0000', '64.0000'), 'VA' => array('41.9000', '12.4500'), 'VC' => array('13.2500', '-61.2000'),
|
150 |
+
'VE' => array('8.0000', '-66.0000'), 'VG' => array('18.5000', '-64.5000'), 'VI' => array('18.3333', '-64.8333'),
|
151 |
+
'VN' => array('16.0000', '106.0000'), 'VU' => array('-16.0000', '167.0000'), 'WF' => array('-13.3000', '-176.2000'),
|
152 |
+
'WS' => array('-13.5833', '-172.3333'), 'YE' => array('15.0000', '48.0000'), 'YT' => array('-12.8333', '45.1667'),
|
153 |
+
'ZA' => array('-29.0000', '24.0000'), 'ZM' => array('-15.0000', '30.0000'), 'ZR' => array('-4.038333', '21.758664'),
|
154 |
+
'ZW' => array('-20.0000', '30.0000')
|
155 |
+
);
|
156 |
+
|
157 |
+
$searchEngines = array(
|
158 |
+
array('srh_name' => 'Google', 'srh_icon' => 'google.png', 'srh_query_parameter' => 'q', 'srh_identifier' => 'google',
|
159 |
+
'crawlers' => array(
|
160 |
+
'Googlebot',
|
161 |
+
'Googlebot-News',
|
162 |
+
'Googlebot-Image',
|
163 |
+
'Googlebot-Video',
|
164 |
+
'Googlebot-Mobile',
|
165 |
+
'Mediapartners-Google',
|
166 |
+
'Mediapartners',
|
167 |
+
'Mediapartners-Google',
|
168 |
+
'Mediapartners',
|
169 |
+
'AdsBot-Google'
|
170 |
+
)
|
171 |
+
),
|
172 |
+
array('srh_name' => 'Bing', 'srh_icon' => 'bing.png', 'srh_query_parameter' => 'q', 'srh_identifier' => 'bing',
|
173 |
+
'crawlers' => array(
|
174 |
+
'bingbot'
|
175 |
+
)
|
176 |
+
),
|
177 |
+
array('srh_name' => 'Yahoo Search', 'srh_icon' => 'yahoo.png', 'srh_query_parameter' => 'p', 'srh_identifier' => 'yahoo',
|
178 |
+
'crawlers' => array(
|
179 |
+
'Yahoo! Slurp',
|
180 |
+
'Yahoo! Slurp China',
|
181 |
+
'YahooSeeker'
|
182 |
+
)
|
183 |
+
),
|
184 |
+
array('srh_name' => 'Ask', 'srh_icon' => 'ask.png', 'srh_query_parameter' => 'q', 'srh_identifier' => 'ask',
|
185 |
+
'crawlers' => array(
|
186 |
+
'Ask Jeeves'
|
187 |
+
)
|
188 |
+
),
|
189 |
+
array('srh_name' => 'WebCrawler', 'srh_icon' => 'webcrawler.gif', 'srh_query_parameter' => 'q', 'srh_identifier' => 'webcrawler',
|
190 |
+
'crawlers' => array(
|
191 |
+
'FAST-WebCrawler'
|
192 |
+
)
|
193 |
+
),
|
194 |
+
array('srh_name' => 'Baiduspider', 'srh_icon' => 'baiduspider.png', 'srh_query_parameter' => 'domain_name', 'srh_identifier' => 'baiduspider',
|
195 |
+
'crawlers' => array(
|
196 |
+
'Baiduspider'
|
197 |
+
)
|
198 |
+
),
|
199 |
+
array('srh_name' => 'DuckDuckGo', 'srh_icon' => 'duckduckgo.png', 'srh_query_parameter' => 'q', 'srh_identifier' => 'duckduckgo',
|
200 |
+
'crawlers' => array(
|
201 |
+
'DuckDuckBot'
|
202 |
+
)
|
203 |
+
),
|
204 |
+
array('srh_name' => 'Yandex', 'srh_icon' => 'yandex.png', 'srh_query_parameter' => 'text', 'srh_identifier' => 'yandex',
|
205 |
+
'crawlers' => array(
|
206 |
+
'YandexBot'
|
207 |
+
)
|
208 |
+
),
|
209 |
+
array('srh_name' => 'Aol Search', 'srh_icon' => 'aol.png', 'srh_query_parameter' => 'q', 'srh_identifier' => 'aol',
|
210 |
+
'crawlers' => array(
|
211 |
+
'inktomi',
|
212 |
+
'aol.com'
|
213 |
+
)
|
214 |
+
),
|
215 |
+
array('srh_name' => 'Dotmic', 'srh_icon' => 'dotmic.gif', 'srh_query_parameter' => 'q', 'srh_identifier' => 'dotmic',
|
216 |
+
'crawlers' => array(
|
217 |
+
'DotBot',
|
218 |
+
)
|
219 |
+
),
|
220 |
+
);
|
221 |
+
|
222 |
+
$browsers = array(
|
223 |
+
array('bsr_id' => 1, 'bsr_name' => 'IE', 'bsr_icon' => 'ie.png'),
|
224 |
+
array('bsr_id' => 2, 'bsr_name' => 'Firefox', 'bsr_icon' => 'firefox.png'),
|
225 |
+
array('bsr_id' => 3, 'bsr_name' => 'Netscape', 'bsr_icon' => 'netscape.png'),
|
226 |
+
array('bsr_id' => 4, 'bsr_name' => 'Chrome', 'bsr_icon' => 'chrome.png'),
|
227 |
+
array('bsr_id' => 5, 'bsr_name' => 'Gecko/Mozilla', 'bsr_icon' => 'mozilla.png'),
|
228 |
+
array('bsr_id' => 6, 'bsr_name' => 'Opera Mini', 'bsr_icon' => 'opera.png'),
|
229 |
+
array('bsr_id' => 7, 'bsr_name' => 'Opera', 'bsr_icon' => 'opera.png'),
|
230 |
+
array('bsr_id' => 8, 'bsr_name' => 'Safari', 'bsr_icon' => 'safari.png'),
|
231 |
+
array('bsr_id' => 9, 'bsr_name' => 'iPad', 'bsr_icon' => 'ipad.png'),
|
232 |
+
array('bsr_id' => 10, 'bsr_name' => 'Android', 'bsr_icon' => 'android.png'),
|
233 |
+
array('bsr_id' => 11, 'bsr_name' => 'AIR', 'bsr_icon' => 'air.png'),
|
234 |
+
array('bsr_id' => 12, 'bsr_name' => 'Fluid', 'bsr_icon' => 'fluid.png'),
|
235 |
+
array('bsr_id' => 13, 'bsr_name' => 'Maxthon', 'bsr_icon' => 'maxthon.png'),
|
236 |
+
array('bsr_id' => 14, 'bsr_name' => 'unknown', 'bsr_icon' => 'unknown.png')
|
237 |
+
);
|
238 |
+
|
239 |
+
$dayHours = array(
|
240 |
+
array('vtm_time_from' => '00:00:00', 'vtm_time_to' => '00:59:59'),
|
241 |
+
array('vtm_time_from' => '01:00:00', 'vtm_time_to' => '01:59:59'),
|
242 |
+
array('vtm_time_from' => '02:00:00', 'vtm_time_to' => '02:59:59'),
|
243 |
+
array('vtm_time_from' => '03:00:00', 'vtm_time_to' => '03:59:59'),
|
244 |
+
array('vtm_time_from' => '04:00:00', 'vtm_time_to' => '04:59:59'),
|
245 |
+
array('vtm_time_from' => '05:00:00', 'vtm_time_to' => '05:59:59'),
|
246 |
+
array('vtm_time_from' => '06:00:00', 'vtm_time_to' => '06:59:59'),
|
247 |
+
array('vtm_time_from' => '07:00:00', 'vtm_time_to' => '07:59:59'),
|
248 |
+
array('vtm_time_from' => '08:00:00', 'vtm_time_to' => '08:59:59'),
|
249 |
+
array('vtm_time_from' => '09:00:00', 'vtm_time_to' => '09:59:59'),
|
250 |
+
array('vtm_time_from' => '10:00:00', 'vtm_time_to' => '10:59:59'),
|
251 |
+
array('vtm_time_from' => '11:00:00', 'vtm_time_to' => '11:59:59'),
|
252 |
+
array('vtm_time_from' => '12:00:00', 'vtm_time_to' => '12:59:59'),
|
253 |
+
array('vtm_time_from' => '13:00:00', 'vtm_time_to' => '13:59:59'),
|
254 |
+
array('vtm_time_from' => '14:00:00', 'vtm_time_to' => '14:59:59'),
|
255 |
+
array('vtm_time_from' => '15:00:00', 'vtm_time_to' => '15:59:59'),
|
256 |
+
array('vtm_time_from' => '16:00:00', 'vtm_time_to' => '16:59:59'),
|
257 |
+
array('vtm_time_from' => '17:00:00', 'vtm_time_to' => '17:59:59'),
|
258 |
+
array('vtm_time_from' => '18:00:00', 'vtm_time_to' => '18:59:59'),
|
259 |
+
array('vtm_time_from' => '19:00:00', 'vtm_time_to' => '19:59:59'),
|
260 |
+
array('vtm_time_from' => '20:00:00', 'vtm_time_to' => '20:59:59'),
|
261 |
+
array('vtm_time_from' => '21:00:00', 'vtm_time_to' => '21:59:59'),
|
262 |
+
array('vtm_time_from' => '22:00:00', 'vtm_time_to' => '22:59:59'),
|
263 |
+
array('vtm_time_from' => '23:00:00', 'vtm_time_to' => '23:59:59'),
|
264 |
+
);
|
265 |
+
?>
|
functions.php
ADDED
@@ -0,0 +1,1514 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Called when plugin is activated or upgraded
|
5 |
+
*
|
6 |
+
* @uses add_option()
|
7 |
+
* @uses get_option()
|
8 |
+
*
|
9 |
+
* @return void
|
10 |
+
*/
|
11 |
+
|
12 |
+
|
13 |
+
|
14 |
+
|
15 |
+
function ahc_search_engins_count(){
|
16 |
+
global $wpdb;
|
17 |
+
$result = $wpdb->get_results("SELECT count(srh_id) as cnt FROM `ahc_searching_visits`", OBJECT);
|
18 |
+
if($result !== false){
|
19 |
+
return $result[0]->cnt;
|
20 |
+
}
|
21 |
+
return false;
|
22 |
+
|
23 |
+
|
24 |
+
}
|
25 |
+
|
26 |
+
|
27 |
+
function ahc_browsers_count(){
|
28 |
+
global $wpdb;
|
29 |
+
$result = $wpdb->get_results("SELECT count(`bsr_id`) as cnt FROM `ahc_browsers` WHERE `bsr_visits` > 0", OBJECT);
|
30 |
+
if($result !== false){
|
31 |
+
return $result[0]->cnt;
|
32 |
+
}
|
33 |
+
return false;
|
34 |
+
|
35 |
+
|
36 |
+
}
|
37 |
+
|
38 |
+
function ahc_getVisitsTime(){
|
39 |
+
global $wpdb;
|
40 |
+
$result = $wpdb->get_results("SELECT COUNT( `vtm_id` ) cnt FROM ahc_visits_time", OBJECT);
|
41 |
+
if($result !== false){
|
42 |
+
return $result[0]->cnt;
|
43 |
+
}
|
44 |
+
return false;
|
45 |
+
}
|
46 |
+
|
47 |
+
function ahc_getCountriesCount(){
|
48 |
+
global $wpdb;
|
49 |
+
$result = $wpdb->get_results("SELECT COUNT( `ctr_id` ) cnt FROM ahc_countries", OBJECT);
|
50 |
+
if($result !== false){
|
51 |
+
return $result[0]->cnt;
|
52 |
+
}
|
53 |
+
return false;
|
54 |
+
}
|
55 |
+
|
56 |
+
|
57 |
+
function ahc_set_default_options(){
|
58 |
+
// plugin activation
|
59 |
+
require_once("database_basics_data.php");
|
60 |
+
|
61 |
+
if(get_option('ahc_wp_hits_counter_options') === false){
|
62 |
+
|
63 |
+
$plugin_options = array();
|
64 |
+
$plugin_options['ahc_version'] = '1.0';
|
65 |
+
$plugin_options['available_languages'] = array('ar' => 'عربي', 'en' => 'English');
|
66 |
+
$plugin_options['ahc_lang'] = 'en';
|
67 |
+
$plugin_options['user_roles_to_not_track'] = array('administrator' => true, 'editor' => true, 'author' => true, 'contributor' => true, 'subscriber' => false);
|
68 |
+
add_option( 'ahc_wp_hits_counter_options', $plugin_options);
|
69 |
+
set_time_limit(300);
|
70 |
+
}
|
71 |
+
ahc_create_database_tables();
|
72 |
+
|
73 |
+
if(ahc_getCountriesCount() == 0)
|
74 |
+
{
|
75 |
+
ahc_insert_countries_into_table($internetCountryCodes, $contriesLatLng);
|
76 |
+
}
|
77 |
+
|
78 |
+
if(ahc_search_engins_count() == 0)
|
79 |
+
{
|
80 |
+
ahc_insert_search_engines_into_table($searchEngines);
|
81 |
+
}
|
82 |
+
|
83 |
+
if(ahc_browsers_count() == 0)
|
84 |
+
{
|
85 |
+
ahc_insert_browsers_into_table($browsers);
|
86 |
+
}
|
87 |
+
|
88 |
+
if(ahc_getVisitsTime() == 0)
|
89 |
+
{
|
90 |
+
ahc_insert_visit_times_into_table($dayHours);
|
91 |
+
}
|
92 |
+
|
93 |
+
|
94 |
+
|
95 |
+
|
96 |
+
}
|
97 |
+
|
98 |
+
function ahc_get_visitors_by_date(){
|
99 |
+
global $wpdb;
|
100 |
+
$lastDays = AHC_VISITORS_VISITS_LIMIT;
|
101 |
+
$response = array();
|
102 |
+
$beginning = new DateTime();
|
103 |
+
$beginning->modify('-'.$lastDays.' day');
|
104 |
+
$sql = "SELECT vst_date, vst_visitors
|
105 |
+
FROM ahc_visitors
|
106 |
+
WHERE DATE(vst_date) >= DATE(%s)";
|
107 |
+
|
108 |
+
|
109 |
+
$results = $wpdb->get_results($wpdb->prepare($sql, $beginning->format('Y-m-d')), OBJECT);
|
110 |
+
if($results !== false){
|
111 |
+
for($i = count($results); $i < $lastDays; $i++){
|
112 |
+
$beginning->modify('+1 day');
|
113 |
+
$xx .= "['".$beginning->format('Y-m-d')."', 0], ";
|
114 |
+
}
|
115 |
+
foreach($results as $r)
|
116 |
+
{
|
117 |
+
|
118 |
+
$hitDate = new DateTime($r->vst_date);
|
119 |
+
$xx .= "['".$hitDate->format('Y-m-d')."', ".$r->vst_visitors."], ";
|
120 |
+
}
|
121 |
+
|
122 |
+
}
|
123 |
+
return '['.$xx.']';
|
124 |
+
}
|
125 |
+
|
126 |
+
function ahc_get_visits_by_date(){
|
127 |
+
global $wpdb;
|
128 |
+
$lastDays = AHC_VISITORS_VISITS_LIMIT;
|
129 |
+
$response = array();
|
130 |
+
$beginning = new DateTime();
|
131 |
+
$beginning->modify('-'.$lastDays.' day');
|
132 |
+
$sql = "SELECT vst_date, vst_visits
|
133 |
+
FROM ahc_visitors
|
134 |
+
WHERE DATE(vst_date) >= DATE(%s)";
|
135 |
+
|
136 |
+
|
137 |
+
$results = $wpdb->get_results($wpdb->prepare($sql, $beginning->format('Y-m-d')), OBJECT);
|
138 |
+
if($results !== false){
|
139 |
+
for($i = count($results); $i < $lastDays; $i++){
|
140 |
+
$beginning->modify('+1 day');
|
141 |
+
$x .= "['".$beginning->format('Y-m-d')."', 0], ";
|
142 |
+
}
|
143 |
+
foreach($results as $r)
|
144 |
+
{
|
145 |
+
$hitDate = new DateTime($r->vst_date);
|
146 |
+
$x .= "['".$hitDate->format('Y-m-d')."', ".$r->vst_visits."], ";
|
147 |
+
}
|
148 |
+
|
149 |
+
}
|
150 |
+
return '['.$x.']';
|
151 |
+
}
|
152 |
+
|
153 |
+
|
154 |
+
//--------------------------------------------
|
155 |
+
/**
|
156 |
+
* Called when plugin is deactivated
|
157 |
+
*
|
158 |
+
* @return void
|
159 |
+
*/
|
160 |
+
function ahc_unset_default_options(){
|
161 |
+
}
|
162 |
+
//--------------------------------------------
|
163 |
+
/**
|
164 |
+
* Creates plugin page link in the admin menu
|
165 |
+
*
|
166 |
+
* @uses add_menu_page()
|
167 |
+
* @uses plugins_url()
|
168 |
+
*
|
169 |
+
* @return void
|
170 |
+
*/
|
171 |
+
function ahc_create_admin_menu_link(){
|
172 |
+
add_menu_page('Visitors Traffic Real Time Statistics', 'Visitors Traffic', 'manage_options', 'ahc_hits_counter_menu', 'ahc_create_plugin_overview_page',
|
173 |
+
plugins_url('/images/vtrts.png', AHC_PLUGIN_MAIN_FILE));
|
174 |
+
}
|
175 |
+
//--------------------------------------------
|
176 |
+
/**
|
177 |
+
* Creates the main overview page
|
178 |
+
*
|
179 |
+
* @return void
|
180 |
+
*/
|
181 |
+
function ahc_create_plugin_overview_page(){
|
182 |
+
require_once(AHC_PLUGIN_ROOT_DIR.AHC_DS.'lang'.AHC_DS.Globals::$lang.'_lang.php');
|
183 |
+
include("overview.php");
|
184 |
+
}
|
185 |
+
//--------------------------------------------
|
186 |
+
/**
|
187 |
+
* Returns links array of available languages
|
188 |
+
*
|
189 |
+
* @uses get_option()
|
190 |
+
* @uses add_query_arg()
|
191 |
+
*
|
192 |
+
* @return array
|
193 |
+
*/
|
194 |
+
function ahc_get_change_lang_links(){
|
195 |
+
$plugin_options = get_option('ahc_wp_hits_counter_options');
|
196 |
+
$links = array();
|
197 |
+
$i = 0;
|
198 |
+
foreach($plugin_options['available_languages'] as $key => $value){
|
199 |
+
if(Globals::$lang != $key){
|
200 |
+
$links[$i]['name'] = $value;
|
201 |
+
$links[$i]['href'] = add_query_arg('ahc_lang', $key);
|
202 |
+
$i++;
|
203 |
+
}
|
204 |
+
}
|
205 |
+
unset($plugin_options);
|
206 |
+
unset($i);
|
207 |
+
return $links;
|
208 |
+
}
|
209 |
+
//--------------------------------------------
|
210 |
+
/**
|
211 |
+
* Decides whether or not should track the current visitor
|
212 |
+
*
|
213 |
+
* @uses is_user_logged_in()
|
214 |
+
* @uses WP_User::$roles
|
215 |
+
*
|
216 |
+
* @return boolean
|
217 |
+
*/
|
218 |
+
function ahc_should_track_visitor(){
|
219 |
+
global $current_user;
|
220 |
+
$allow = true;
|
221 |
+
if(is_user_logged_in()){
|
222 |
+
$user = new WP_User($current_user->ID);
|
223 |
+
if(!empty($user->roles) && is_array($user->roles)){
|
224 |
+
foreach($user->roles as $role){
|
225 |
+
$found = (isset(Globals::$plugin_options['user_roles_to_not_track'][$role]))? Globals::$plugin_options['user_roles_to_not_track'][$role] : false;
|
226 |
+
if($found){
|
227 |
+
$allow = false;
|
228 |
+
break;
|
229 |
+
}
|
230 |
+
}
|
231 |
+
}
|
232 |
+
}
|
233 |
+
return $allow;
|
234 |
+
}
|
235 |
+
//--------------------------------------------
|
236 |
+
/**
|
237 |
+
* Returns true if the current user has administrator role
|
238 |
+
*
|
239 |
+
* @uses is_user_logged_in()
|
240 |
+
* @uses WP_User::$roles
|
241 |
+
*
|
242 |
+
* @return boolean
|
243 |
+
*/
|
244 |
+
function ahc_has_administrator_role(){
|
245 |
+
global $user_ID;
|
246 |
+
$is_admin = false;
|
247 |
+
if(is_user_logged_in()){
|
248 |
+
$user = new WP_User($user_ID);
|
249 |
+
if(!empty($user->roles) && is_array($user->roles)){
|
250 |
+
foreach($user->roles as $role){
|
251 |
+
if($role == 'administrator'){
|
252 |
+
$is_admin = true;
|
253 |
+
break;
|
254 |
+
}
|
255 |
+
}
|
256 |
+
}
|
257 |
+
}
|
258 |
+
return $is_admin;
|
259 |
+
}
|
260 |
+
//--------------------------------------------
|
261 |
+
/**
|
262 |
+
* Creates database plugin tables
|
263 |
+
*
|
264 |
+
* @uses wpdb::query()
|
265 |
+
*
|
266 |
+
* @return boolean
|
267 |
+
*/
|
268 |
+
/*
|
269 |
+
function ahc_create_database_tables(){
|
270 |
+
global $wpdb;
|
271 |
+
$sqlQueries = array();
|
272 |
+
$sqlQueries[] = "CREATE TABLE IF NOT EXISTS `ahc_hits`
|
273 |
+
(
|
274 |
+
`hit_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
275 |
+
PRIMARY KEY(`hit_id`),
|
276 |
+
`hit_ip_address` VARCHAR(50) NOT NULL,
|
277 |
+
`hit_user_agent` VARCHAR(200) NOT NULL,
|
278 |
+
`hit_request_uri` VARCHAR(200) NULL,
|
279 |
+
`hit_page_id` VARCHAR(30) NOT NULL,
|
280 |
+
`hit_page_title` VARCHAR(200) NULL,
|
281 |
+
`hit_referer` VARCHAR(300) NULL,
|
282 |
+
`hit_referer_site` VARCHAR(100) NULL,
|
283 |
+
`srh_id` INT(3) UNSIGNED NULL,
|
284 |
+
`hit_search_words` VARCHAR(200) NULL,
|
285 |
+
`bsr_id` INT(3) UNSIGNED NOT NULL,
|
286 |
+
`hit_date` DATE NOT NULL,
|
287 |
+
`hit_time` TIME NOT NULL
|
288 |
+
) ENGINE=MyISAM DEFAULT CHARSET=utf8";
|
289 |
+
|
290 |
+
$sqlQueries[] = "CREATE TABLE IF NOT EXISTS `ahc_browsers`
|
291 |
+
(
|
292 |
+
`bsr_id` INT(3) UNSIGNED NOT NULL,
|
293 |
+
PRIMARY KEY(`bsr_id`),
|
294 |
+
`bsr_name` VARCHAR(100) NOT NULL,
|
295 |
+
`bsr_icon` VARCHAR(50),
|
296 |
+
`bsr_visits` INT(11) NOT NULL DEFAULT 0
|
297 |
+
) ENGINE=MyISAM DEFAULT CHARSET=utf8";
|
298 |
+
|
299 |
+
$sqlQueries[] = "CREATE TABLE IF NOT EXISTS `ahc_search_engines`
|
300 |
+
(
|
301 |
+
`srh_id` INT(3) UNSIGNED NOT NULL AUTO_INCREMENT,
|
302 |
+
PRIMARY KEY(`srh_id`),
|
303 |
+
`srh_name` VARCHAR(100) NOT NULL,
|
304 |
+
`srh_query_parameter` VARCHAR(10) NOT NULL,
|
305 |
+
`srh_icon` VARCHAR(50),
|
306 |
+
`srh_identifier` VARCHAR(50)
|
307 |
+
) ENGINE=MyISAM DEFAULT CHARSET=utf8";
|
308 |
+
|
309 |
+
$sqlQueries[] = "CREATE TABLE IF NOT EXISTS `ahc_search_engine_crawlers`
|
310 |
+
(
|
311 |
+
`bot_name` VARCHAR(50) NOT NULL,
|
312 |
+
`srh_id` INT(3) UNSIGNED NOT NULL
|
313 |
+
) ENGINE=MyISAM DEFAULT CHARSET=utf8";
|
314 |
+
|
315 |
+
$sqlQueries[] = "CREATE TABLE IF NOT EXISTS `ahc_visitors`
|
316 |
+
(
|
317 |
+
`vst_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
318 |
+
PRIMARY KEY (`vst_id`),
|
319 |
+
`vst_date` DATE NOT NULL,
|
320 |
+
`vst_visitors` INT(11) UNSIGNED NULL DEFAULT 0,
|
321 |
+
`vst_visits` INT(11) UNSIGNED NULL DEFAULT 0
|
322 |
+
) ENGINE=MyISAM DEFAULT CHARSET=utf8";
|
323 |
+
|
324 |
+
$sqlQueries[] = "CREATE TABLE IF NOT EXISTS `ahc_searching_visits`
|
325 |
+
(
|
326 |
+
`vtsh_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
327 |
+
PRIMARY KEY (`vtsh_id`),
|
328 |
+
`srh_id` INT(3) UNSIGNED NOT NULL,
|
329 |
+
`vtsh_date` DATE NOT NULL,
|
330 |
+
`vtsh_visits` INT(11) UNSIGNED NOT NULL DEFAULT 0
|
331 |
+
) ENGINE=MyISAM DEFAULT CHARSET=utf8";
|
332 |
+
|
333 |
+
$sqlQueries[] = "CREATE TABLE IF NOT EXISTS `ahc_refering_sites`
|
334 |
+
(
|
335 |
+
`rfr_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
336 |
+
PRIMARY KEY (`rfr_id`),
|
337 |
+
`rfr_site_name` VARCHAR(100) NOT NULL,
|
338 |
+
`rfr_visits` INT(11) UNSIGNED NULL DEFAULT 0
|
339 |
+
) ENGINE=MyISAM DEFAULT CHARSET=utf8";
|
340 |
+
|
341 |
+
$sqlQueries[] = "CREATE TABLE IF NOT EXISTS `ahc_recent_visitors`
|
342 |
+
(
|
343 |
+
`vtr_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
344 |
+
PRIMARY KEY (`vtr_id`),
|
345 |
+
`vtr_ip_address` VARCHAR(50) NOT NULL,
|
346 |
+
`vtr_referer` VARCHAR(300) NULL,
|
347 |
+
`srh_id` INT(3) UNSIGNED NULL,
|
348 |
+
`bsr_id` INT(3) UNSIGNED NOT NULL,
|
349 |
+
`vtr_date` DATE NOT NULL,
|
350 |
+
`vtr_time` TIME NOT NULL
|
351 |
+
) ENGINE=MyISAM DEFAULT CHARSET=utf8";
|
352 |
+
|
353 |
+
$sqlQueries[] = "CREATE TABLE IF NOT EXISTS `ahc_keywords`
|
354 |
+
(
|
355 |
+
`kwd_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
356 |
+
PRIMARY KEY (`kwd_id`),
|
357 |
+
`kwd_ip_address` VARCHAR(50) NOT NULL,
|
358 |
+
`kwd_keywords` VARCHAR(200) NOT NULL,
|
359 |
+
`kwd_referer` VARCHAR(300) NOT NULL,
|
360 |
+
`srh_id` INT(3) UNSIGNED NOT NULL,
|
361 |
+
`bsr_id` INT(3) UNSIGNED NOT NULL,
|
362 |
+
`kwd_date` DATE NOT NULL,
|
363 |
+
`kwd_time` TIME NOT NULL
|
364 |
+
) ENGINE=MyISAM DEFAULT CHARSET=utf8";
|
365 |
+
|
366 |
+
$sqlQueries[] = "CREATE TABLE IF NOT EXISTS `ahc_title_traffic`
|
367 |
+
(
|
368 |
+
`til_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
369 |
+
PRIMARY KEY (`til_id`),
|
370 |
+
`til_page_id` VARCHAR(30) NOT NULL,
|
371 |
+
`til_page_title` VARCHAR(100),
|
372 |
+
`til_hits` INT(11) UNSIGNED NOT NULL
|
373 |
+
) ENGINE=MyISAM DEFAULT CHARSET=utf8";
|
374 |
+
|
375 |
+
$sqlQueries[] = "CREATE TABLE IF NOT EXISTS `ahc_visits_time`
|
376 |
+
(
|
377 |
+
`vtm_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
378 |
+
PRIMARY KEY (`vtm_id`),
|
379 |
+
`vtm_time_from` TIME NOT NULL,
|
380 |
+
`vtm_time_to` TIME NOT NULL,
|
381 |
+
`vtm_visitors` INT(11) UNSIGNED NOT NULL DEFAULT 0,
|
382 |
+
`vtm_visits` INT(11) UNSIGNED NOT NULL DEFAULT 0
|
383 |
+
) ENGINE=MyISAM DEFAULT CHARSET=utf8";
|
384 |
+
|
385 |
+
foreach($sqlQueries as $sql){
|
386 |
+
if($wpdb->query($sql) === false){
|
387 |
+
return false;
|
388 |
+
}
|
389 |
+
}
|
390 |
+
return true;
|
391 |
+
}
|
392 |
+
*/
|
393 |
+
|
394 |
+
|
395 |
+
|
396 |
+
function ahc_create_database_tables(){
|
397 |
+
global $wpdb;
|
398 |
+
$sqlQueries = array();
|
399 |
+
$sqlQueries[] = "CREATE TABLE IF NOT EXISTS `ahc_hits`
|
400 |
+
(
|
401 |
+
`hit_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
402 |
+
PRIMARY KEY(`hit_id`),
|
403 |
+
`hit_ip_address` VARCHAR(50) NOT NULL,
|
404 |
+
`hit_user_agent` VARCHAR(200) NOT NULL,
|
405 |
+
`hit_request_uri` VARCHAR(200) NULL,
|
406 |
+
`hit_page_id` VARCHAR(30) NOT NULL,
|
407 |
+
`hit_page_title` VARCHAR(200) NULL,
|
408 |
+
`ctr_id` INT(3) UNSIGNED NULL,
|
409 |
+
`hit_referer` VARCHAR(300) NULL,
|
410 |
+
`hit_referer_site` VARCHAR(100) NULL,
|
411 |
+
`srh_id` INT(3) UNSIGNED NULL,
|
412 |
+
`hit_search_words` VARCHAR(200) NULL,
|
413 |
+
`bsr_id` INT(3) UNSIGNED NOT NULL,
|
414 |
+
`hit_date` DATE NOT NULL,
|
415 |
+
`hit_time` TIME NOT NULL
|
416 |
+
) ENGINE=MyISAM DEFAULT CHARSET=utf8";
|
417 |
+
|
418 |
+
$sqlQueries[] = "CREATE TABLE IF NOT EXISTS `ahc_browsers`
|
419 |
+
(
|
420 |
+
`bsr_id` INT(3) UNSIGNED NOT NULL,
|
421 |
+
PRIMARY KEY(`bsr_id`),
|
422 |
+
`bsr_name` VARCHAR(100) NOT NULL,
|
423 |
+
`bsr_icon` VARCHAR(50),
|
424 |
+
`bsr_visits` INT(11) NOT NULL DEFAULT 0
|
425 |
+
) ENGINE=MyISAM DEFAULT CHARSET=utf8";
|
426 |
+
|
427 |
+
$sqlQueries[] = "CREATE TABLE IF NOT EXISTS `ahc_search_engines`
|
428 |
+
(
|
429 |
+
`srh_id` INT(3) UNSIGNED NOT NULL AUTO_INCREMENT,
|
430 |
+
PRIMARY KEY(`srh_id`),
|
431 |
+
`srh_name` VARCHAR(100) NOT NULL,
|
432 |
+
`srh_query_parameter` VARCHAR(10) NOT NULL,
|
433 |
+
`srh_icon` VARCHAR(50),
|
434 |
+
`srh_identifier` VARCHAR(50)
|
435 |
+
) ENGINE=MyISAM DEFAULT CHARSET=utf8";
|
436 |
+
|
437 |
+
$sqlQueries[] = "CREATE TABLE IF NOT EXISTS `ahc_search_engine_crawlers`
|
438 |
+
(
|
439 |
+
`bot_name` VARCHAR(50) NOT NULL,
|
440 |
+
`srh_id` INT(3) UNSIGNED NOT NULL
|
441 |
+
) ENGINE=MyISAM DEFAULT CHARSET=utf8";
|
442 |
+
|
443 |
+
$sqlQueries[] = "CREATE TABLE IF NOT EXISTS `ahc_countries`
|
444 |
+
(
|
445 |
+
`ctr_id` INT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
|
446 |
+
PRIMARY KEY(`ctr_id`),
|
447 |
+
`ctr_name` VARCHAR(100) NOT NULL,
|
448 |
+
`ctr_internet_code` VARCHAR(5) NOT NULL,
|
449 |
+
`ctr_latitude` VARCHAR(30) NULL,
|
450 |
+
`ctr_longitude` VARCHAR(30) NULL,
|
451 |
+
`ctr_visitors` INT(11) NOT NULL DEFAULT 0,
|
452 |
+
`ctr_visits` INT(11) NOT NULL DEFAULT 0
|
453 |
+
) ENGINE=MyISAM DEFAULT CHARSET=utf8";
|
454 |
+
|
455 |
+
$sqlQueries[] = "CREATE TABLE IF NOT EXISTS `ahc_visitors`
|
456 |
+
(
|
457 |
+
`vst_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
458 |
+
PRIMARY KEY (`vst_id`),
|
459 |
+
`vst_date` DATE NOT NULL,
|
460 |
+
`vst_visitors` INT(11) UNSIGNED NULL DEFAULT 0,
|
461 |
+
`vst_visits` INT(11) UNSIGNED NULL DEFAULT 0
|
462 |
+
) ENGINE=MyISAM DEFAULT CHARSET=utf8";
|
463 |
+
|
464 |
+
$sqlQueries[] = "CREATE TABLE IF NOT EXISTS `ahc_searching_visits`
|
465 |
+
(
|
466 |
+
`vtsh_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
467 |
+
PRIMARY KEY (`vtsh_id`),
|
468 |
+
`srh_id` INT(3) UNSIGNED NOT NULL,
|
469 |
+
`vtsh_date` DATE NOT NULL,
|
470 |
+
`vtsh_visits` INT(11) UNSIGNED NOT NULL DEFAULT 0
|
471 |
+
) ENGINE=MyISAM DEFAULT CHARSET=utf8";
|
472 |
+
|
473 |
+
$sqlQueries[] = "CREATE TABLE IF NOT EXISTS `ahc_refering_sites`
|
474 |
+
(
|
475 |
+
`rfr_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
476 |
+
PRIMARY KEY (`rfr_id`),
|
477 |
+
`rfr_site_name` VARCHAR(100) NOT NULL,
|
478 |
+
`rfr_visits` INT(11) UNSIGNED NULL DEFAULT 0
|
479 |
+
) ENGINE=MyISAM DEFAULT CHARSET=utf8";
|
480 |
+
|
481 |
+
$sqlQueries[] = "CREATE TABLE IF NOT EXISTS `ahc_recent_visitors`
|
482 |
+
(
|
483 |
+
`vtr_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
484 |
+
PRIMARY KEY (`vtr_id`),
|
485 |
+
`vtr_ip_address` VARCHAR(50) NOT NULL,
|
486 |
+
`vtr_referer` VARCHAR(300) NULL,
|
487 |
+
`srh_id` INT(3) UNSIGNED NULL,
|
488 |
+
`bsr_id` INT(3) UNSIGNED NOT NULL,
|
489 |
+
`ctr_id` INT(5) UNSIGNED NULL,
|
490 |
+
`vtr_date` DATE NOT NULL,
|
491 |
+
`vtr_time` TIME NOT NULL
|
492 |
+
) ENGINE=MyISAM DEFAULT CHARSET=utf8";
|
493 |
+
|
494 |
+
$sqlQueries[] = "CREATE TABLE IF NOT EXISTS `ahc_keywords`
|
495 |
+
(
|
496 |
+
`kwd_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
497 |
+
PRIMARY KEY (`kwd_id`),
|
498 |
+
`kwd_ip_address` VARCHAR(50) NOT NULL,
|
499 |
+
`kwd_keywords` VARCHAR(200) NOT NULL,
|
500 |
+
`kwd_referer` VARCHAR(300) NOT NULL,
|
501 |
+
`srh_id` INT(3) UNSIGNED NOT NULL,
|
502 |
+
`ctr_id` INT(5) UNSIGNED NULL,
|
503 |
+
`bsr_id` INT(3) UNSIGNED NOT NULL,
|
504 |
+
`kwd_date` DATE NOT NULL,
|
505 |
+
`kwd_time` TIME NOT NULL
|
506 |
+
) ENGINE=MyISAM DEFAULT CHARSET=utf8";
|
507 |
+
|
508 |
+
$sqlQueries[] = "CREATE TABLE IF NOT EXISTS `ahc_title_traffic`
|
509 |
+
(
|
510 |
+
`til_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
511 |
+
PRIMARY KEY (`til_id`),
|
512 |
+
`til_page_id` VARCHAR(30) NOT NULL,
|
513 |
+
`til_page_title` VARCHAR(100),
|
514 |
+
`til_hits` INT(11) UNSIGNED NOT NULL
|
515 |
+
) ENGINE=MyISAM DEFAULT CHARSET=utf8";
|
516 |
+
|
517 |
+
$sqlQueries[] = "CREATE TABLE IF NOT EXISTS `ahc_visits_time`
|
518 |
+
(
|
519 |
+
`vtm_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
|
520 |
+
PRIMARY KEY (`vtm_id`),
|
521 |
+
`vtm_time_from` TIME NOT NULL,
|
522 |
+
`vtm_time_to` TIME NOT NULL,
|
523 |
+
`vtm_visitors` INT(11) UNSIGNED NOT NULL DEFAULT 0,
|
524 |
+
`vtm_visits` INT(11) UNSIGNED NOT NULL DEFAULT 0
|
525 |
+
) ENGINE=MyISAM DEFAULT CHARSET=utf8";
|
526 |
+
|
527 |
+
foreach($sqlQueries as $sql){
|
528 |
+
if($wpdb->query($sql) === false){
|
529 |
+
return false;
|
530 |
+
}
|
531 |
+
}
|
532 |
+
return true;
|
533 |
+
}
|
534 |
+
//--------------------------------------------
|
535 |
+
/**
|
536 |
+
* Inserts search engines into ahc_search_engines table
|
537 |
+
*
|
538 |
+
* @uses wpdb::insert()
|
539 |
+
* @uses wpdb::$insert_id
|
540 |
+
*
|
541 |
+
* @param array $searchEngines.
|
542 |
+
* @return boolean
|
543 |
+
*/
|
544 |
+
function ahc_insert_search_engines_into_table($searchEngines){
|
545 |
+
global $wpdb;
|
546 |
+
foreach($searchEngines as $se){
|
547 |
+
$result = $wpdb->insert('ahc_search_engines', array(
|
548 |
+
'srh_name' => $se['srh_name'],
|
549 |
+
'srh_query_parameter' => $se['srh_query_parameter'],
|
550 |
+
'srh_icon' => $se['srh_icon'],
|
551 |
+
'srh_identifier' => $se['srh_identifier']
|
552 |
+
),
|
553 |
+
array(
|
554 |
+
'%s', '%s', '%s', '%s'
|
555 |
+
)
|
556 |
+
);
|
557 |
+
if($result !== false){
|
558 |
+
$srh_id = $wpdb->insert_id;
|
559 |
+
foreach($se['crawlers'] as $crawler){
|
560 |
+
$result2 = $wpdb->insert('ahc_search_engine_crawlers', array(
|
561 |
+
'bot_name' => $crawler,
|
562 |
+
'srh_id' => $srh_id
|
563 |
+
),
|
564 |
+
array(
|
565 |
+
'%s', '%d'
|
566 |
+
)
|
567 |
+
);
|
568 |
+
if($result2 === false){
|
569 |
+
return false;
|
570 |
+
}
|
571 |
+
}
|
572 |
+
} else{
|
573 |
+
return false;
|
574 |
+
}
|
575 |
+
}
|
576 |
+
return true;
|
577 |
+
}
|
578 |
+
//--------------------------------------------
|
579 |
+
/**
|
580 |
+
* Inserts browsers into ahc_browsers table
|
581 |
+
*
|
582 |
+
* @uses wpdb::insert()
|
583 |
+
*
|
584 |
+
* @param array $browsers
|
585 |
+
* @return boolean
|
586 |
+
*/
|
587 |
+
function ahc_insert_browsers_into_table($browsers){
|
588 |
+
global $wpdb;
|
589 |
+
foreach($browsers as $browser){
|
590 |
+
$result = $wpdb->insert('ahc_browsers', array(
|
591 |
+
'bsr_id' => $browser['bsr_id'],
|
592 |
+
'bsr_name' => $browser['bsr_name'],
|
593 |
+
'bsr_icon' => $browser['bsr_icon']
|
594 |
+
),
|
595 |
+
array(
|
596 |
+
'%d', '%s', '%s'
|
597 |
+
)
|
598 |
+
);
|
599 |
+
if($result === false){
|
600 |
+
return false;
|
601 |
+
}
|
602 |
+
}
|
603 |
+
return true;
|
604 |
+
}
|
605 |
+
|
606 |
+
/**
|
607 |
+
* Inserts countries into ahc_countroes table
|
608 |
+
*
|
609 |
+
* @uses wpdb::insert()
|
610 |
+
*
|
611 |
+
* @param array $internetCountryCodes. internet codes and names of countries
|
612 |
+
* @param array $contriesLatLng. LatLng of countries
|
613 |
+
* @return boolean
|
614 |
+
*/
|
615 |
+
function ahc_insert_countries_into_table($internetCountryCodes, $contriesLatLng){
|
616 |
+
global $wpdb;
|
617 |
+
$c = 1;
|
618 |
+
$length = count($internetCountryCodes);
|
619 |
+
foreach($internetCountryCodes as $internetCode => $countryName){
|
620 |
+
$ctr_latitude = $ctr_longitude = NULL;
|
621 |
+
if(isset($contriesLatLng[$internetCode])){
|
622 |
+
$ctr_latitude = $contriesLatLng[$internetCode][0];
|
623 |
+
$ctr_longitude = $contriesLatLng[$internetCode][1];
|
624 |
+
}
|
625 |
+
$result = $wpdb->insert('ahc_countries', array(
|
626 |
+
'ctr_name' => $countryName,
|
627 |
+
'ctr_internet_code' => $internetCode,
|
628 |
+
'ctr_latitude' => $ctr_latitude,
|
629 |
+
'ctr_longitude' => $ctr_longitude
|
630 |
+
),
|
631 |
+
array(
|
632 |
+
'%s', '%s', '%s', '%s'
|
633 |
+
)
|
634 |
+
);
|
635 |
+
if($result === false){
|
636 |
+
return false;
|
637 |
+
}
|
638 |
+
}
|
639 |
+
return true;
|
640 |
+
}
|
641 |
+
|
642 |
+
//--------------------------------------------
|
643 |
+
/**
|
644 |
+
* Inserts periods into ahc_visits_time table
|
645 |
+
*
|
646 |
+
* @uses wpdb::insert()
|
647 |
+
*
|
648 |
+
* @param array $dayHours
|
649 |
+
* @return boolean
|
650 |
+
*/
|
651 |
+
function ahc_insert_visit_times_into_table($dayHours){
|
652 |
+
global $wpdb;
|
653 |
+
foreach($dayHours as $t){
|
654 |
+
$result = $wpdb->insert('ahc_visits_time', array(
|
655 |
+
'vtm_time_from' => $t['vtm_time_from'],
|
656 |
+
'vtm_time_to' => $t['vtm_time_to'],
|
657 |
+
'vtm_visitors' => 0
|
658 |
+
),
|
659 |
+
array(
|
660 |
+
'%s', '%s', '%d'
|
661 |
+
)
|
662 |
+
);
|
663 |
+
if($result === false){
|
664 |
+
return false;
|
665 |
+
}
|
666 |
+
}
|
667 |
+
return true;
|
668 |
+
}
|
669 |
+
//--------------------------------------------
|
670 |
+
/**
|
671 |
+
* Returns the first and last days of the week of the date you pass
|
672 |
+
*
|
673 |
+
* @param string $date
|
674 |
+
* @param string $format Optional
|
675 |
+
* @return array
|
676 |
+
*/
|
677 |
+
function ahc_get_week_limits($date, $format = 'Y-m-d'){
|
678 |
+
$beginingDay = new DateTime($date);
|
679 |
+
$endingDay = new DateTime($date);
|
680 |
+
$date = new DateTime($date);
|
681 |
+
switch($date->format('w')){
|
682 |
+
case 0: // sun
|
683 |
+
//$beginingDay->modify('-1 day');
|
684 |
+
$endingDay->modify('+6 day');
|
685 |
+
break;
|
686 |
+
|
687 |
+
case 1: // mon
|
688 |
+
$beginingDay->modify('-1 day');
|
689 |
+
$endingDay->modify('+5 day');
|
690 |
+
break;
|
691 |
+
|
692 |
+
case 2: // Tue
|
693 |
+
$beginingDay->modify('-2 day');;
|
694 |
+
$endingDay->modify('+4 day');
|
695 |
+
break;
|
696 |
+
|
697 |
+
case 3: // Wed
|
698 |
+
$beginingDay->modify('-3 day');;
|
699 |
+
$endingDay->modify('+3 day');
|
700 |
+
break;
|
701 |
+
|
702 |
+
case 4: // Thu
|
703 |
+
$beginingDay->modify('-4 day');
|
704 |
+
$endingDay->modify('+2 day');
|
705 |
+
break;
|
706 |
+
|
707 |
+
case 6: // Fri
|
708 |
+
$beginingDay->modify('-5 day');
|
709 |
+
$endingDay->modify('+1 day');
|
710 |
+
break;
|
711 |
+
}
|
712 |
+
return array(0 => $beginingDay->format($format), 1 => $endingDay->format($format));
|
713 |
+
}
|
714 |
+
//--------------------------------------------
|
715 |
+
/**
|
716 |
+
* Return summary statistics of visitors and visits
|
717 |
+
*
|
718 |
+
* @return array
|
719 |
+
*/
|
720 |
+
function ahc_get_summary_statistics(){
|
721 |
+
$arr = array();
|
722 |
+
$arr['today'] = ahc_get_visitors_visits_in_period('today');
|
723 |
+
$arr['yesterday'] = ahc_get_visitors_visits_in_period('yesterday');
|
724 |
+
$arr['week'] = ahc_get_visitors_visits_in_period('week');
|
725 |
+
$arr['month'] = ahc_get_visitors_visits_in_period('month');
|
726 |
+
$arr['year'] = ahc_get_visitors_visits_in_period('year');
|
727 |
+
$arr['total'] = ahc_get_visitors_visits_in_period();
|
728 |
+
return $arr;
|
729 |
+
}
|
730 |
+
//--------------------------------------------
|
731 |
+
/**
|
732 |
+
* Return counts visitors and visits in certain day (today|yesterday), certain period(last week, last month, last year) or total
|
733 |
+
*
|
734 |
+
* @uses wpdb::prepare()
|
735 |
+
* @uses wpdb::get_results()
|
736 |
+
*
|
737 |
+
* @param string $period Optional
|
738 |
+
* @return mixed
|
739 |
+
*/
|
740 |
+
function ahc_get_visitors_visits_in_period($period = 'total'){
|
741 |
+
global $wpdb;
|
742 |
+
$date = new DateTime();
|
743 |
+
$sql = "SELECT SUM(vst_visitors) AS vst_visitors, SUM(vst_visits) AS vst_visits
|
744 |
+
FROM `ahc_visitors`
|
745 |
+
WHERE 1 = 1";
|
746 |
+
$results = false;
|
747 |
+
switch($period){
|
748 |
+
case 'today':
|
749 |
+
$sql .= " AND DATE(vst_date) = DATE(NOW())";
|
750 |
+
$results = $wpdb->get_results($sql, OBJECT);
|
751 |
+
break;
|
752 |
+
|
753 |
+
case 'yesterday':
|
754 |
+
$date->modify('-1 day');
|
755 |
+
$sql .= " AND DATE(vst_date) = DATE(%s)";
|
756 |
+
$results = $wpdb->get_results($wpdb->prepare($sql, $date->format('Y-m-d')), OBJECT);
|
757 |
+
break;
|
758 |
+
|
759 |
+
case 'week':
|
760 |
+
$limits = ahc_get_week_limits($date->format('Y-m-d'));
|
761 |
+
$sql .= " AND DATE(vst_date) >= DATE(%s) AND DATE(vst_date) <= DATE(%s)";
|
762 |
+
$results = $wpdb->get_results($wpdb->prepare($sql, $limits[0], $limits[1]), OBJECT);
|
763 |
+
break;
|
764 |
+
|
765 |
+
case 'month':
|
766 |
+
$sql .= " AND DATE(vst_date) >= DATE(%s) AND DATE(vst_date) <= DATE(%s)";
|
767 |
+
$results = $wpdb->get_results($wpdb->prepare($sql, $date->format('Y-m-01'), $date->format('Y-m-d')), OBJECT);
|
768 |
+
break;
|
769 |
+
|
770 |
+
case 'year':
|
771 |
+
$sql .= " AND DATE(vst_date) >= DATE(%s) AND DATE(vst_date) <= DATE(%s)";
|
772 |
+
$results = $wpdb->get_results($wpdb->prepare($sql, $date->format('Y-01-01'), $date->format('Y-12-31')), OBJECT);
|
773 |
+
break;
|
774 |
+
|
775 |
+
default:
|
776 |
+
$results = $wpdb->get_results($sql, OBJECT);
|
777 |
+
}
|
778 |
+
|
779 |
+
if($results !== false){
|
780 |
+
return array(
|
781 |
+
'visitors' => (empty($results[0]->vst_visitors)? 0 : $results[0]->vst_visitors),
|
782 |
+
'visits' => (empty($results[0]->vst_visits)? 0 : $results[0]->vst_visits)
|
783 |
+
);
|
784 |
+
} else{
|
785 |
+
return false;
|
786 |
+
}
|
787 |
+
}
|
788 |
+
//--------------------------------------------
|
789 |
+
/**
|
790 |
+
* Return visits in a period from today
|
791 |
+
*
|
792 |
+
* @uses wpdb::prepare()
|
793 |
+
* @uses wpdb::get_results()
|
794 |
+
*
|
795 |
+
* @return array
|
796 |
+
*/
|
797 |
+
function ahc_get_visitors_visits_by_date(){
|
798 |
+
global $wpdb;
|
799 |
+
$lastDays = AHC_VISITORS_VISITS_LIMIT - 1;
|
800 |
+
$response = array();
|
801 |
+
$beginning = new DateTime();
|
802 |
+
$beginning->modify('-'.$lastDays.' day');
|
803 |
+
$sql = "SELECT vst_date, vst_visitors, vst_visits
|
804 |
+
FROM ahc_visitors
|
805 |
+
WHERE DATE(vst_date) >= DATE(%s)";
|
806 |
+
|
807 |
+
|
808 |
+
$results = $wpdb->get_results($wpdb->prepare($sql, $beginning->format('Y-m-d')), OBJECT);
|
809 |
+
if($results !== false){
|
810 |
+
$response['success'] = true;
|
811 |
+
$response['date'] = array();
|
812 |
+
for($i = count($results); $i < $lastDays; $i++){
|
813 |
+
$beginning->modify('+1 day');
|
814 |
+
$response['data']['dates'][] = $beginning->format('d/m');
|
815 |
+
$response['data']['visitors'][] = 0;
|
816 |
+
$response['data']['visits'][] = 0;
|
817 |
+
}
|
818 |
+
foreach($results as $r){
|
819 |
+
$hitDate = new DateTime($r->vst_date);
|
820 |
+
$response['data']['dates'][] = $hitDate->format('d/m');
|
821 |
+
$response['data']['visitors'][] = $r->vst_visitors;
|
822 |
+
$response['data']['visits'][] = $r->vst_visits;
|
823 |
+
}
|
824 |
+
} else{
|
825 |
+
$response['success'] = false;
|
826 |
+
}
|
827 |
+
return $response;
|
828 |
+
}
|
829 |
+
//--------------------------------------------
|
830 |
+
/**
|
831 |
+
* Return visitors visits that came from search engine in a period from today
|
832 |
+
*
|
833 |
+
* @uses wpdb::prepare()
|
834 |
+
* @uses wpdb::get_results()
|
835 |
+
*
|
836 |
+
* @return array
|
837 |
+
*/
|
838 |
+
function ahc_get_serch_visits_by_date(){
|
839 |
+
global $wpdb;
|
840 |
+
$searchEngines = ahc_get_all_search_engines();
|
841 |
+
$lastDays = AHC_VISITORS_VISITS_SUMMARY_LIMIT - 1;
|
842 |
+
$response = array();
|
843 |
+
$beginning = new DateTime();
|
844 |
+
$beginning->modify('-'.$lastDays.' day');
|
845 |
+
$sql = "SELECT srh_id, vtsh_visits, vtsh_date
|
846 |
+
FROM `ahc_searching_visits`
|
847 |
+
WHERE DATE(vtsh_date) >= DATE(%s)";
|
848 |
+
|
849 |
+
$results = $wpdb->get_results($wpdb->prepare($sql, $beginning->format('Y-m-d')), OBJECT);
|
850 |
+
if($results !== false){
|
851 |
+
$arr = array();
|
852 |
+
foreach($results as $r){
|
853 |
+
$hitDate = new DateTime($r->vtsh_date);
|
854 |
+
$arr[$hitDate->format('Ymd').'-'.$r->srh_id] = $r->vtsh_visits;
|
855 |
+
}
|
856 |
+
|
857 |
+
$response['success'] = true;
|
858 |
+
$response['data']['dates'] = array();
|
859 |
+
foreach($searchEngines as $srhEng){
|
860 |
+
$response['data']['search_engines'][$srhEng['srh_name']] = array();
|
861 |
+
}
|
862 |
+
|
863 |
+
$date = new DateTime();
|
864 |
+
$date->modify('-'.$lastDays.' day');
|
865 |
+
for($i = 0; $i <= $lastDays; $i++){
|
866 |
+
$response['data']['dates'][] = $date->format('d/m');
|
867 |
+
|
868 |
+
foreach($searchEngines as $srhEng){
|
869 |
+
if(isset($arr[$date->format('Ymd').'-'.$srhEng['srh_id']])){
|
870 |
+
$response['data']['search_engines'][$srhEng['srh_name']][] = $arr[$date->format('Ymd').'-'.$srhEng['srh_id']];
|
871 |
+
} else{
|
872 |
+
$response['data']['search_engines'][$srhEng['srh_name']][] = 0;
|
873 |
+
}
|
874 |
+
}
|
875 |
+
|
876 |
+
$date->modify('+1 day');
|
877 |
+
}
|
878 |
+
|
879 |
+
} else{
|
880 |
+
$response['success'] = false;
|
881 |
+
}
|
882 |
+
return $response;
|
883 |
+
}
|
884 |
+
//--------------------------------------------
|
885 |
+
/**
|
886 |
+
* Returns the total visits by search engines
|
887 |
+
*
|
888 |
+
* @uses wpdb::get_results()
|
889 |
+
*
|
890 |
+
* @return mixed
|
891 |
+
*/
|
892 |
+
function ahc_get_total_visits_by_search_engines(){
|
893 |
+
global $wpdb;
|
894 |
+
$result = $wpdb->get_results("SELECT SUM(vtsh_visits) AS total FROM ahc_searching_visits", OBJECT);
|
895 |
+
if($result !== false){
|
896 |
+
return $result[0]->total;
|
897 |
+
}
|
898 |
+
return false;
|
899 |
+
}
|
900 |
+
//--------------------------------------------
|
901 |
+
/**
|
902 |
+
* Return counts visits happened by search engine result in certain day (today|yesterday), certain period(last week, last month, last year) or total
|
903 |
+
*
|
904 |
+
* @uses wpdb::prepare()
|
905 |
+
* @uses wpdb::get_results()
|
906 |
+
*
|
907 |
+
* @param string $period Optional
|
908 |
+
* @return mixed
|
909 |
+
*/
|
910 |
+
function ahc_get_hits_search_engines_referers($period = 'total'){
|
911 |
+
global $wpdb;
|
912 |
+
$date = new DateTime();
|
913 |
+
$sql = "SELECT srh_id, vtsh_visits
|
914 |
+
FROM `ahc_searching_visits`";
|
915 |
+
$results = false;
|
916 |
+
switch($period){
|
917 |
+
case 'today':
|
918 |
+
$sql .= " WHERE DATE(vtsh_date) = DATE(NOW())";
|
919 |
+
$results = $wpdb->get_results($sql, OBJECT);
|
920 |
+
break;
|
921 |
+
|
922 |
+
case 'yesterday':
|
923 |
+
$date->modify('-1 day');
|
924 |
+
$sql .= " WHERE DATE(vtsh_date) = DATE(%s)";
|
925 |
+
$results = $wpdb->get_results($wpdb->prepare($sql, $date->format('Y-m-d')), OBJECT);
|
926 |
+
break;
|
927 |
+
|
928 |
+
case 'week':
|
929 |
+
$limits = ahc_get_week_limits($date->format('Y-m-d'));
|
930 |
+
$sql .= " WHERE DATE(vtsh_date) >= DATE(%s) AND DATE(vtsh_date) <= DATE(%s)";
|
931 |
+
$results = $wpdb->get_results($wpdb->prepare($sql, $limits[0], $limits[1]), OBJECT);
|
932 |
+
break;
|
933 |
+
|
934 |
+
case 'month':
|
935 |
+
$sql .= " WHERE DATE(vtsh_date) >= DATE('".$date->format('Y-m-01')."') AND DATE(vtsh_date) <= DATE('".$date->format('Y-m-t')."')";
|
936 |
+
$results = $wpdb->get_results($wpdb->prepare($sql, $limits[0], $limits[1]), OBJECT);
|
937 |
+
break;
|
938 |
+
|
939 |
+
case 'year':
|
940 |
+
$sql .= " WHERE DATE(vtsh_date) >= DATE(%s) AND DATE(vtsh_date) <= DATE(%s)";
|
941 |
+
$results = $wpdb->get_results($wpdb->prepare($sql, $date->format('Y-01-01'), $date->format('Y-12-31')), OBJECT);
|
942 |
+
break;
|
943 |
+
|
944 |
+
default:
|
945 |
+
$results = $wpdb->get_results($sql, OBJECT);
|
946 |
+
}
|
947 |
+
|
948 |
+
$hitsReferers = array();
|
949 |
+
if($results !== false){
|
950 |
+
foreach($results as $r){
|
951 |
+
$hitsReferers[$r->srh_id] = $r->vtsh_visits;
|
952 |
+
}
|
953 |
+
return $hitsReferers;
|
954 |
+
}
|
955 |
+
return false;
|
956 |
+
}
|
957 |
+
//--------------------------------------------
|
958 |
+
/**
|
959 |
+
* Retrieves all search engines
|
960 |
+
*
|
961 |
+
* @uses wpdb::get_results()
|
962 |
+
*
|
963 |
+
* @return mixed
|
964 |
+
*/
|
965 |
+
function ahc_get_all_search_engines(){
|
966 |
+
global $wpdb;
|
967 |
+
$sql = "SELECT `srh_id`, `srh_name`, `srh_icon` FROM `ahc_search_engines`";
|
968 |
+
$searchEngines = array();
|
969 |
+
$c = 0;
|
970 |
+
$results = $wpdb->get_results($sql, OBJECT);
|
971 |
+
if($results !== false){
|
972 |
+
foreach($results as $re){
|
973 |
+
$searchEngines[$c]['srh_id'] = $re->srh_id;
|
974 |
+
$searchEngines[$c]['srh_name'] = $re->srh_name;
|
975 |
+
$searchEngines[$c]['srh_icon'] = $re->srh_icon;
|
976 |
+
$c++;
|
977 |
+
}
|
978 |
+
return $searchEngines;
|
979 |
+
}
|
980 |
+
return false;
|
981 |
+
}
|
982 |
+
//--------------------------------------------
|
983 |
+
/**
|
984 |
+
* Retrieves count of visits order by browsers
|
985 |
+
*
|
986 |
+
* @uses wpdb::get_results()
|
987 |
+
*
|
988 |
+
* @return array
|
989 |
+
*/
|
990 |
+
function ahc_get_browsers_hits_counts(){
|
991 |
+
global $wpdb;
|
992 |
+
$sql = "SELECT `bsr_id`, `bsr_name`, `bsr_visits`
|
993 |
+
FROM `ahc_browsers`
|
994 |
+
WHERE `bsr_visits` > 0";
|
995 |
+
$results = $wpdb->get_results($sql, OBJECT);
|
996 |
+
$response = array();
|
997 |
+
if($results !== false){
|
998 |
+
$response['success'] = true;
|
999 |
+
$response['data'] = array();
|
1000 |
+
$c = 0;
|
1001 |
+
foreach($results as $bsr){
|
1002 |
+
$response['data'][$c]['bsr_id'] = $bsr->bsr_id;
|
1003 |
+
$response['data'][$c]['bsr_name'] = $bsr->bsr_name;
|
1004 |
+
$response['data'][$c]['hits'] = $bsr->bsr_visits;
|
1005 |
+
$c++;
|
1006 |
+
}
|
1007 |
+
} else{
|
1008 |
+
$response['success'] = false;
|
1009 |
+
}
|
1010 |
+
return $response;
|
1011 |
+
}
|
1012 |
+
//--------------------------------------------
|
1013 |
+
/**
|
1014 |
+
* Retrieves top referring sites
|
1015 |
+
*
|
1016 |
+
* @uses wpdb::prepare()
|
1017 |
+
* @uses wpdb::get_results()
|
1018 |
+
*
|
1019 |
+
* @return mixed
|
1020 |
+
*/
|
1021 |
+
function ahc_get_top_refering_sites(){
|
1022 |
+
global $wpdb;
|
1023 |
+
$sql = "SELECT rfr_site_name, rfr_visits
|
1024 |
+
FROM `ahc_refering_sites`
|
1025 |
+
ORDER BY rfr_visits DESC
|
1026 |
+
LIMIT %d OFFSET 0";
|
1027 |
+
$results = $wpdb->get_results($wpdb->prepare($sql, AHC_TOP_REFERING_SITES_LIMIT), OBJECT);
|
1028 |
+
if($results !== false){
|
1029 |
+
$arr = array();
|
1030 |
+
$c = 0;
|
1031 |
+
foreach($results as $referer){
|
1032 |
+
$arr[$c]['site_name'] = $referer->rfr_site_name;
|
1033 |
+
$arr[$c]['total_hits'] = $referer->rfr_visits;
|
1034 |
+
$c++;
|
1035 |
+
}
|
1036 |
+
return $arr;
|
1037 |
+
} else{
|
1038 |
+
return false;
|
1039 |
+
}
|
1040 |
+
}
|
1041 |
+
//--------------------------------------------
|
1042 |
+
/**
|
1043 |
+
* Retrieves recent visitors
|
1044 |
+
*
|
1045 |
+
* @uses wpdb::prepare()
|
1046 |
+
* @uses wpdb::get_results()
|
1047 |
+
*
|
1048 |
+
* @return mixed
|
1049 |
+
*/
|
1050 |
+
function ahc_get_recent_visitors(){
|
1051 |
+
global $wpdb, $_SERVER;
|
1052 |
+
$sql = "SELECT v.vtr_id, v.vtr_ip_address, v.vtr_referer, v.vtr_date, v.vtr_time,
|
1053 |
+
b.bsr_name, b.bsr_icon
|
1054 |
+
FROM `ahc_recent_visitors` AS v
|
1055 |
+
JOIN `ahc_browsers` AS b ON v.bsr_id = b.bsr_id
|
1056 |
+
WHERE v.vtr_ip_address NOT LIKE 'UNKNOWN%%'
|
1057 |
+
ORDER BY v.vtr_date DESC
|
1058 |
+
LIMIT %d OFFSET 0";
|
1059 |
+
|
1060 |
+
$results = $wpdb->get_results($wpdb->prepare($sql, AHC_RECENT_VISITORS_LIMIT));
|
1061 |
+
if($results !== false){
|
1062 |
+
$arr = array();
|
1063 |
+
$c = 0;
|
1064 |
+
if(is_array($results)){
|
1065 |
+
foreach($results as $hit){
|
1066 |
+
$arr[$c]['hit_id'] = $hit->vtr_id;
|
1067 |
+
$arr[$c]['hit_ip_address'] = $hit->vtr_ip_address;
|
1068 |
+
$arr[$c]['hit_referer'] = (parse_url($hit->vtr_referer, PHP_URL_HOST) == $_SERVER['SERVER_NAME'])? '' : rawurldecode($hit->vtr_referer);
|
1069 |
+
$arr[$c]['hit_date'] = $hit->vtr_date;
|
1070 |
+
$arr[$c]['hit_time'] = $hit->vtr_time;
|
1071 |
+
$arr[$c]['bsr_name'] = $hit->bsr_name;
|
1072 |
+
$arr[$c]['bsr_icon'] = $hit->bsr_icon;
|
1073 |
+
$c++;
|
1074 |
+
}
|
1075 |
+
}
|
1076 |
+
return $arr;
|
1077 |
+
} else{
|
1078 |
+
return false;
|
1079 |
+
}
|
1080 |
+
}
|
1081 |
+
//--------------------------------------------
|
1082 |
+
/**
|
1083 |
+
* Retrieves latest of key words used in search
|
1084 |
+
*
|
1085 |
+
* @uses wpdb::prepare()
|
1086 |
+
* @uses wpdb::get_results()
|
1087 |
+
*
|
1088 |
+
* @return mixed
|
1089 |
+
*/
|
1090 |
+
function ahc_get_latest_search_key_words_used(){
|
1091 |
+
global $wpdb;
|
1092 |
+
$sql = "SELECT k.kwd_ip_address, k.kwd_referer, k.kwd_keywords, k.kwd_date, k.kwd_time,
|
1093 |
+
b.bsr_name, b.bsr_icon, s.srh_name, s.srh_icon
|
1094 |
+
FROM `ahc_keywords` AS k
|
1095 |
+
JOIN `ahc_browsers` AS b ON k.bsr_id = b.bsr_id
|
1096 |
+
JOIN `ahc_search_engines` AS s on k.srh_id = s.srh_id
|
1097 |
+
WHERE k.kwd_ip_address NOT LIKE 'UNKNOWN%%'
|
1098 |
+
ORDER BY k.kwd_date DESC, k.kwd_time DESC
|
1099 |
+
LIMIT %d OFFSET 0";
|
1100 |
+
|
1101 |
+
$results = $wpdb->get_results($wpdb->prepare($sql, AHC_RECENT_KEYWORDS_LIMIT), OBJECT);
|
1102 |
+
if($results !== false){
|
1103 |
+
$arr = array();
|
1104 |
+
$c = 0;
|
1105 |
+
foreach($results as $re){
|
1106 |
+
$arr[$c]['hit_referer'] = rawurldecode($re->kwd_referer);
|
1107 |
+
$arr[$c]['hit_search_words'] = $re->kwd_keywords;
|
1108 |
+
$arr[$c]['hit_date'] = $re->kwd_date;
|
1109 |
+
$arr[$c]['hit_time'] = $re->kwd_time;
|
1110 |
+
$arr[$c]['hit_ip_address'] = $re->kwd_ip_address;
|
1111 |
+
$arr[$c]['bsr_name'] = $re->bsr_name;
|
1112 |
+
$arr[$c]['bsr_icon'] = $re->bsr_icon;
|
1113 |
+
$arr[$c]['srh_name'] = $re->srh_name;
|
1114 |
+
$arr[$c]['srh_icon'] = $re->srh_icon;
|
1115 |
+
$c++;
|
1116 |
+
}
|
1117 |
+
return $arr;
|
1118 |
+
} else{
|
1119 |
+
return false;
|
1120 |
+
}
|
1121 |
+
}
|
1122 |
+
//--------------------------------------------
|
1123 |
+
/**
|
1124 |
+
* Is in login page
|
1125 |
+
*
|
1126 |
+
* @return boolean
|
1127 |
+
*/
|
1128 |
+
function ahc_is_login_page() {
|
1129 |
+
return in_array($GLOBALS['pagenow'], array('wp-login.php', 'wp-register.php'));
|
1130 |
+
}
|
1131 |
+
//--------------------------------------------
|
1132 |
+
/**
|
1133 |
+
* Detect if the visitor is search engine bot
|
1134 |
+
*
|
1135 |
+
* @uses wpdb::get_results()
|
1136 |
+
*
|
1137 |
+
* @return boolean
|
1138 |
+
*/
|
1139 |
+
function ahc_is_search_engine_bot(){
|
1140 |
+
global $wpdb, $_SERVER;
|
1141 |
+
$results = $wpdb->get_results("SELECT `bot_name` FROM `ahc_search_engine_crawlers`", OBJECT);
|
1142 |
+
foreach($results as $crawler){
|
1143 |
+
if(stripos($_SERVER['HTTP_USER_AGENT'], $crawler->bot_name) !== false){
|
1144 |
+
return true;
|
1145 |
+
}
|
1146 |
+
}
|
1147 |
+
|
1148 |
+
if(stripos($_SERVER['REQUEST_URI'], 'robots.txt') !== false){
|
1149 |
+
return true;
|
1150 |
+
}
|
1151 |
+
|
1152 |
+
if(stripos($_SERVER['REQUEST_URI'], 'Bot') !== false){
|
1153 |
+
return true;
|
1154 |
+
}
|
1155 |
+
|
1156 |
+
if(stripos($_SERVER['REQUEST_URI'], 'bot') !== false){
|
1157 |
+
return true;
|
1158 |
+
}
|
1159 |
+
return false;
|
1160 |
+
}
|
1161 |
+
//--------------------------------------------
|
1162 |
+
/**
|
1163 |
+
* Detect if the visitor is WordPress bot
|
1164 |
+
*
|
1165 |
+
* @return boolean
|
1166 |
+
*/
|
1167 |
+
function ahc_is_wordpress_bot(){
|
1168 |
+
global $_SERVER;
|
1169 |
+
if(stripos($_SERVER['HTTP_USER_AGENT'], 'WordPress') !== false){
|
1170 |
+
return true;
|
1171 |
+
}
|
1172 |
+
return false;
|
1173 |
+
}
|
1174 |
+
//--------------------------------------------
|
1175 |
+
/**
|
1176 |
+
* Detects post id, post title and post type of current page
|
1177 |
+
*
|
1178 |
+
* @uses wpdb::prepare()
|
1179 |
+
* @uses wpdb::get_results()
|
1180 |
+
*
|
1181 |
+
* @param object $query. this object is passed to the callback function of "parse_query" hooked action
|
1182 |
+
* @return mixed
|
1183 |
+
*/
|
1184 |
+
function ahc_detect_requested_page($query){
|
1185 |
+
global $wpdb;
|
1186 |
+
$page_id = '';
|
1187 |
+
$vars = $query->query_vars;
|
1188 |
+
if(isset($vars['p']) && !empty($vars['p'])){
|
1189 |
+
$result = $wpdb->get_results($wpdb->prepare("SELECT post_title FROM ".$wpdb->prefix."posts WHERE ID = %d ", $vars['p']));
|
1190 |
+
if($result !== false && $wpdb->num_rows > 0){
|
1191 |
+
return array('page_id' => $vars['p'], 'page_title' => $result[0]->post_title, 'post_type' => 'post');
|
1192 |
+
}
|
1193 |
+
}
|
1194 |
+
|
1195 |
+
else if(isset($vars['name']) && !empty($vars['name'])){
|
1196 |
+
$result = $wpdb->get_results($wpdb->prepare("SELECT ID, post_title FROM ".$wpdb->prefix."posts WHERE post_name = %s ", $vars['name']));
|
1197 |
+
if($result !== false && $wpdb->num_rows > 0){
|
1198 |
+
return array('page_id' => $result[0]->ID, 'page_title' => $result[0]->post_title, 'post_type' => 'post');
|
1199 |
+
}
|
1200 |
+
}
|
1201 |
+
|
1202 |
+
else if(isset($vars['pagename']) && !empty($vars['pagename'])){
|
1203 |
+
$result = $wpdb->get_results($wpdb->prepare("SELECT ID, post_title FROM ".$wpdb->prefix."posts WHERE post_name = %s AND post_type = %s", get_subpage_name($vars['pagename']), 'page'));
|
1204 |
+
if($result !== false && $wpdb->num_rows > 0){
|
1205 |
+
return array('page_id' => $result[0]->ID, 'page_title' => $result[0]->post_title, 'post_type' => 'page');
|
1206 |
+
}
|
1207 |
+
}
|
1208 |
+
|
1209 |
+
else if(isset($vars['page_id']) && !empty($vars['page_id'])){
|
1210 |
+
$result = $wpdb->get_results($wpdb->prepare("SELECT post_title FROM ".$wpdb->prefix."posts WHERE ID = %s AND post_type = %s", $vars['page_id'], 'page'));
|
1211 |
+
if($result !== false && $wpdb->num_rows > 0){
|
1212 |
+
return array('page_id' => $page_id, 'page_title' => $result[0]->post_title, 'post_type' => 'page');
|
1213 |
+
}
|
1214 |
+
}
|
1215 |
+
|
1216 |
+
else{
|
1217 |
+
return array('page_id' => 'HOMEPAGE', 'page_title' => NULL, 'post_type' => NULL);
|
1218 |
+
}
|
1219 |
+
}
|
1220 |
+
|
1221 |
+
function get_subpage_name($page_name) {
|
1222 |
+
$sub_name = strrchr($page_name, '/');
|
1223 |
+
if (!$sub_name) {
|
1224 |
+
return $page_name;
|
1225 |
+
}
|
1226 |
+
return substr($sub_name,1);
|
1227 |
+
}
|
1228 |
+
//--------------------------------------------
|
1229 |
+
/**
|
1230 |
+
* Initiates tracking process
|
1231 |
+
*
|
1232 |
+
* @param object $query. this object is passed to this callback function of "parse_request" hooked action
|
1233 |
+
* @return void
|
1234 |
+
*/
|
1235 |
+
function ahc_track_visitor($query){
|
1236 |
+
if(ahc_should_track_visitor() && !ahc_is_login_page() && !ahc_is_search_engine_bot() && !ahc_is_wordpress_bot()){
|
1237 |
+
$page = ahc_detect_requested_page($query);
|
1238 |
+
if(is_array($page)){
|
1239 |
+
Globals::$page_id = $page['page_id'];
|
1240 |
+
Globals::$page_title = $page['page_title'];
|
1241 |
+
Globals::$post_type = $page['post_type'];
|
1242 |
+
} else{
|
1243 |
+
return;
|
1244 |
+
}
|
1245 |
+
$hitsCounter = new WPHitsCounter(Globals::$page_id, Globals::$page_title, Globals::$post_type);
|
1246 |
+
$hitsCounter->traceVisitorHit();
|
1247 |
+
}
|
1248 |
+
}
|
1249 |
+
//--------------------------------------------
|
1250 |
+
/**
|
1251 |
+
* Ceil for decimal numbers with precision
|
1252 |
+
*
|
1253 |
+
* @param float $number
|
1254 |
+
* @param integer $precision
|
1255 |
+
* @param string $separator
|
1256 |
+
* @return float
|
1257 |
+
*/
|
1258 |
+
function ceil_dec($number,$precision,$separator){
|
1259 |
+
if(strpos($number, '.') !== false){
|
1260 |
+
$numberpart=explode($separator,$number);
|
1261 |
+
$numberpart[1]=substr_replace($numberpart[1],$separator,$precision,0);
|
1262 |
+
if($numberpart[0]>=0)
|
1263 |
+
{$numberpart[1]=ceil($numberpart[1]);}
|
1264 |
+
else
|
1265 |
+
{$numberpart[1]=floor($numberpart[1]);}
|
1266 |
+
|
1267 |
+
$ceil_number= array($numberpart[0],$numberpart[1]);
|
1268 |
+
return implode($separator,$ceil_number);
|
1269 |
+
}
|
1270 |
+
return $number;
|
1271 |
+
}
|
1272 |
+
//--------------------------------------------
|
1273 |
+
/**
|
1274 |
+
* Retrieve sum visits by post title
|
1275 |
+
*
|
1276 |
+
* @uses wpdb::prepare()
|
1277 |
+
* @uses wpdb::get_results()
|
1278 |
+
*
|
1279 |
+
* @return mixed
|
1280 |
+
*/
|
1281 |
+
function ahc_get_traffic_by_title(){
|
1282 |
+
global $wpdb;
|
1283 |
+
$sql1 = "SELECT SUM(hits) AS sm FROM (
|
1284 |
+
SELECT SUM(til_hits) AS hits
|
1285 |
+
FROM ahc_title_traffic
|
1286 |
+
GROUP BY til_page_id
|
1287 |
+
) myTable";
|
1288 |
+
|
1289 |
+
$sql2 = "SELECT til_page_id, til_page_title, til_hits
|
1290 |
+
FROM ahc_title_traffic
|
1291 |
+
GROUP BY til_page_id
|
1292 |
+
ORDER BY til_hits DESC
|
1293 |
+
LIMIT %d OFFSET 0";
|
1294 |
+
|
1295 |
+
$result1 = $wpdb->get_results($sql1);
|
1296 |
+
if($result1 !== false){
|
1297 |
+
$total = $result1[0]->sm;
|
1298 |
+
$result2 = $wpdb->get_results($wpdb->prepare($sql2, AHC_TRAFFIC_BY_TITLE_LIMIT));
|
1299 |
+
if($result2 !== false){
|
1300 |
+
$arr = array();
|
1301 |
+
if($wpdb->num_rows > 0){
|
1302 |
+
$c = 0;
|
1303 |
+
foreach($result2 as $r){
|
1304 |
+
$arr[$c]['rank'] = $c + 1;
|
1305 |
+
$arr[$c]['til_page_id'] = $r->til_page_id;
|
1306 |
+
$arr[$c]['til_page_title'] = $r->til_page_title;
|
1307 |
+
$arr[$c]['til_hits'] = $r->til_hits;
|
1308 |
+
$arr[$c]['percent'] = ($total > 0)? ceil_dec((($r->til_hits / $total) * 100), 2, ".").' %' : 0;
|
1309 |
+
$c++;
|
1310 |
+
}
|
1311 |
+
}
|
1312 |
+
return $arr;
|
1313 |
+
}
|
1314 |
+
}
|
1315 |
+
return false;
|
1316 |
+
}
|
1317 |
+
//--------------------------------------------
|
1318 |
+
/**
|
1319 |
+
* Retrieves sum of visits order by time
|
1320 |
+
*
|
1321 |
+
* @uses wpdb::get_results()
|
1322 |
+
*
|
1323 |
+
* @return mixed
|
1324 |
+
*/
|
1325 |
+
function ahc_get_time_visits(){
|
1326 |
+
global $wpdb;
|
1327 |
+
$sql1 = "SELECT SUM(vtm_visitors) AS sm FROM ahc_visits_time";
|
1328 |
+
$sql2 = "SELECT vtm_time_from, vtm_time_to, vtm_visitors, vtm_visits
|
1329 |
+
FROM ahc_visits_time";
|
1330 |
+
|
1331 |
+
$result1 = $wpdb->get_results($sql1);
|
1332 |
+
if($result1 !== false){
|
1333 |
+
$total = $result1[0]->sm;
|
1334 |
+
$result2 = $wpdb->get_results($sql2);
|
1335 |
+
if($result2 !== false){
|
1336 |
+
$arr = array();
|
1337 |
+
$c = 0;
|
1338 |
+
foreach($result2 as $r){
|
1339 |
+
$timeFrom = $r->vtm_time_from;
|
1340 |
+
$timeFrom = explode(':', $timeFrom);
|
1341 |
+
$timeFrom = $timeFrom[0].':'.$timeFrom[1];
|
1342 |
+
$timeTo = $r->vtm_time_to;
|
1343 |
+
$timeTo = explode(':', $timeTo);
|
1344 |
+
$timeTo = $timeTo[0].':'.$timeTo[1];
|
1345 |
+
|
1346 |
+
$arr[$c]['vtm_time_from'] = $timeFrom;
|
1347 |
+
$arr[$c]['vtm_time_to'] = $timeTo;
|
1348 |
+
$arr[$c]['vtm_visitors'] = $r->vtm_visitors;
|
1349 |
+
$arr[$c]['vtm_visits'] = $r->vtm_visits;
|
1350 |
+
$arr[$c]['percent'] = ($total > 0)? ceil_dec((($r->vtm_visitors / $total) * 100), 2, ".") : 0;
|
1351 |
+
$c++;
|
1352 |
+
}
|
1353 |
+
return $arr;
|
1354 |
+
}
|
1355 |
+
}
|
1356 |
+
return false;
|
1357 |
+
}
|
1358 |
+
//--------------------------------------------
|
1359 |
+
/**
|
1360 |
+
* Returns client IP address
|
1361 |
+
*
|
1362 |
+
* @return string
|
1363 |
+
*/
|
1364 |
+
function ahc_get_client_ip_address(){
|
1365 |
+
global $_SERVER;
|
1366 |
+
$ipAddress = '';
|
1367 |
+
if(isset($_SERVER['HTTP_CLIENT_IP']) && !empty($_SERVER['HTTP_CLIENT_IP'])){
|
1368 |
+
$ipAddress = $_SERVER['HTTP_CLIENT_IP'];
|
1369 |
+
}
|
1370 |
+
else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']) && !empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
|
1371 |
+
$ipAddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
|
1372 |
+
}
|
1373 |
+
else if(isset($_SERVER['HTTP_X_FORWARDED']) && !empty($_SERVER['HTTP_X_FORWARDED'])){
|
1374 |
+
$ipAddress = $_SERVER['HTTP_X_FORWARDED'];
|
1375 |
+
}
|
1376 |
+
else if(isset($_SERVER['HTTP_FORWARDED_FOR']) && !empty($_SERVER['HTTP_FORWARDED_FOR'])){
|
1377 |
+
$ipAddress = $_SERVER['HTTP_FORWARDED_FOR'];
|
1378 |
+
}
|
1379 |
+
else if(isset($_SERVER['HTTP_FORWARDED']) && !empty($_SERVER['HTTP_FORWARDED'])){
|
1380 |
+
$ipAddress = $_SERVER['HTTP_FORWARDED'];
|
1381 |
+
}
|
1382 |
+
else if(isset($_SERVER['REMOTE_ADDR']) && !empty($_SERVER['REMOTE_ADDR'])){
|
1383 |
+
$ipAddress = $_SERVER['REMOTE_ADDR'];
|
1384 |
+
}
|
1385 |
+
else{
|
1386 |
+
$ipAddress = 'UNKNOWN';
|
1387 |
+
}
|
1388 |
+
return $ipAddress;
|
1389 |
+
}
|
1390 |
+
//--------------------------------------------
|
1391 |
+
/**
|
1392 |
+
* To include scripts and styles tags into the head
|
1393 |
+
*
|
1394 |
+
* @uses wp_register_style()
|
1395 |
+
* @uses wp_enqueue_style()
|
1396 |
+
* @uses wp_register_script()
|
1397 |
+
* @uses wp_enqueue_script()
|
1398 |
+
*
|
1399 |
+
* @return void
|
1400 |
+
*/
|
1401 |
+
function ahc_include_scripts(){
|
1402 |
+
wp_register_style('ahc_lang_css', plugins_url('/css/en_newcss.css', AHC_PLUGIN_MAIN_FILE));
|
1403 |
+
wp_enqueue_style('ahc_lang_css');
|
1404 |
+
|
1405 |
+
wp_register_style('ahc_bootstrap_css', plugins_url('/lib/bootstrap/css/bootstrap.min.css', AHC_PLUGIN_MAIN_FILE));
|
1406 |
+
wp_enqueue_style('ahc_bootstrap_css');
|
1407 |
+
|
1408 |
+
wp_enqueue_script('jquery');
|
1409 |
+
|
1410 |
+
wp_register_script('ahc_bootstrap_js', plugins_url('/lib/bootstrap/js/bootstrap.min.js', AHC_PLUGIN_MAIN_FILE));
|
1411 |
+
wp_enqueue_script('ahc_bootstrap_js');
|
1412 |
+
|
1413 |
+
wp_register_script('ahc_lang_js', plugins_url('/lang/js/'.Globals::$lang.'_lang.js', AHC_PLUGIN_MAIN_FILE));
|
1414 |
+
wp_enqueue_script('ahc_lang_js');
|
1415 |
+
|
1416 |
+
wp_register_script('ahc_main_js', plugins_url('/js/js.js', AHC_PLUGIN_MAIN_FILE));
|
1417 |
+
wp_enqueue_script('ahc_main_js');
|
1418 |
+
|
1419 |
+
|
1420 |
+
wp_register_script('ahc_Chart_js', plugins_url('/lib/Chart_js/Chart.min.js', AHC_PLUGIN_MAIN_FILE));
|
1421 |
+
wp_enqueue_script('ahc_Chart_js');
|
1422 |
+
|
1423 |
+
wp_register_script('ahc_google_maps', 'http://maps.googleapis.com/maps/api/js?key=AIzaSyB0fRgC_3Wmp1PY5ZsuzK8VEooiUvVQq3Q&sensor=false');
|
1424 |
+
wp_enqueue_script('ahc_google_maps');
|
1425 |
+
|
1426 |
+
|
1427 |
+
|
1428 |
+
}
|
1429 |
+
//--------------------------------------------
|
1430 |
+
|
1431 |
+
|
1432 |
+
|
1433 |
+
//---------------------------------------------Add button to the admin bar
|
1434 |
+
function vtrts_add_items($admin_bar)
|
1435 |
+
{
|
1436 |
+
global $pluginsurl;
|
1437 |
+
|
1438 |
+
$wccpadminurl = get_admin_url();
|
1439 |
+
//The properties of the new item. Read More about the missing 'parent' parameter below
|
1440 |
+
$args = array(
|
1441 |
+
'id' => 'visitorstraffic',
|
1442 |
+
'title' => __('<img src="'.plugins_url('/images/vtrtspro.png', AHC_PLUGIN_MAIN_FILE).'" style="vertical-align:middle;margin-right:5px;" alt="visitors traffic" title="visitors traffic" />' ),
|
1443 |
+
'href' => $wccpadminurl.'admin.php?page=ahc_hits_counter_menu',
|
1444 |
+
'meta' => array('title' => __('Visitors Traffic Real Time Statistics'),)
|
1445 |
+
);
|
1446 |
+
|
1447 |
+
//This is where the magic works.
|
1448 |
+
$admin_bar->add_menu( $args);
|
1449 |
+
}
|
1450 |
+
//---------------------------------------- Add plugin settings link to Plugins page
|
1451 |
+
function vtrtsp_plugin_add_settings_link( $links ) {
|
1452 |
+
$settings_link = '<a href="admin.php?page=ahc_hits_counter_menu">' . __( 'visitors traffic' ) . '</a>';
|
1453 |
+
array_push( $links, $settings_link );
|
1454 |
+
return $links;
|
1455 |
+
}
|
1456 |
+
//------------------------------------------------------------------------
|
1457 |
+
|
1458 |
+
|
1459 |
+
function ahc_HideMessageAjaxFunction()
|
1460 |
+
{
|
1461 |
+
add_option( 'ahc_upgrade_message','yes');
|
1462 |
+
}
|
1463 |
+
|
1464 |
+
|
1465 |
+
function ahc_after_plugin_row($plugin_file, $plugin_data, $status) {
|
1466 |
+
|
1467 |
+
if(get_option('ahc_upgrade_message') !='yes')
|
1468 |
+
{
|
1469 |
+
$class_name = $plugin_data['slug'];
|
1470 |
+
|
1471 |
+
echo '<tr id="' .$class_name. '-plugin-update-tr" class="plugin-update-tr active">';
|
1472 |
+
echo '<td colspan="3" class="plugin-update">';
|
1473 |
+
echo '<div id="' .$class_name. '-upgradeMsg" class="update-message" style="background:#FFFF99" >';
|
1474 |
+
|
1475 |
+
echo 'You are running visitors traffic real time statistics LITE. To get more features, you can <a href="http://www.wp-buy.com/product/visitors-traffic-real-time-statistics-pro" target="_blank"><strong>upgrade now</strong></a> or ';
|
1476 |
+
|
1477 |
+
echo '<span id="HideMe" style="cursor:pointer" ><a href="javascript:void(0)"><strong>dismiss</strong></a> this message</span>';
|
1478 |
+
echo '</div>';
|
1479 |
+
echo '</td>';
|
1480 |
+
echo '</tr>';
|
1481 |
+
|
1482 |
+
?>
|
1483 |
+
|
1484 |
+
<script type="text/javascript">
|
1485 |
+
jQuery(document).ready(function() {
|
1486 |
+
var row = jQuery('#<?php echo $class_name;?>-plugin-update-tr').closest('tr').prev();
|
1487 |
+
jQuery(row).addClass('update');
|
1488 |
+
|
1489 |
+
|
1490 |
+
jQuery("#HideMe").click(function(){
|
1491 |
+
jQuery.ajax({
|
1492 |
+
type: 'POST',
|
1493 |
+
url: '<?php echo admin_url();?>/admin-ajax.php',
|
1494 |
+
data: {
|
1495 |
+
action: 'ahc_HideMessageAjaxFunction'
|
1496 |
+
},
|
1497 |
+
success: function(data, textStatus, XMLHttpRequest){
|
1498 |
+
|
1499 |
+
jQuery("#<?php echo $class_name;?>-upgradeMsg").hide();
|
1500 |
+
|
1501 |
+
},
|
1502 |
+
error: function(MLHttpRequest, textStatus, errorThrown){
|
1503 |
+
alert(errorThrown);
|
1504 |
+
}
|
1505 |
+
});
|
1506 |
+
});
|
1507 |
+
|
1508 |
+
});
|
1509 |
+
</script>
|
1510 |
+
|
1511 |
+
<?php
|
1512 |
+
}
|
1513 |
+
}
|
1514 |
+
?>
|
images/arrow_down.png
ADDED
Binary file
|
images/arrow_up.png
ADDED
Binary file
|
images/at_graph_icon.png
ADDED
Binary file
|
images/browsers/air.png
ADDED
Binary file
|
images/browsers/android.png
ADDED
Binary file
|
images/browsers/chrome.png
ADDED
Binary file
|
images/browsers/firefox.png
ADDED
Binary file
|
images/browsers/fluid.png
ADDED
Binary file
|
images/browsers/ie.png
ADDED
Binary file
|
images/browsers/ipad.png
ADDED
Binary file
|
images/browsers/maxthon.png
ADDED
Binary file
|
images/browsers/mozilla.png
ADDED
Binary file
|
images/browsers/netscape.png
ADDED
Binary file
|
images/browsers/opera.png
ADDED
Binary file
|
images/browsers/safari.png
ADDED
Binary file
|
images/browsers/unknown.png
ADDED
Binary file
|
images/browsers_nodata.png
ADDED
Binary file
|
images/contact-center-reporting-icon.png
ADDED
Binary file
|
images/flags/Bouvet Island.png
ADDED
Binary file
|
images/flags/Faroe Islands.png
ADDED
Binary file
|
images/flags/ad.png
ADDED
Binary file
|
images/flags/ae.png
ADDED
Binary file
|
images/flags/af.png
ADDED
Binary file
|
images/flags/ag.png
ADDED
Binary file
|
images/flags/ai.png
ADDED
Binary file
|
images/flags/al.png
ADDED
Binary file
|
images/flags/am.png
ADDED
Binary file
|
images/flags/an.png
ADDED
Binary file
|
images/flags/ao.png
ADDED
Binary file
|
images/flags/ar.png
ADDED
Binary file
|
images/flags/as.png
ADDED
Binary file
|
images/flags/at.png
ADDED
Binary file
|
images/flags/au.png
ADDED
Binary file
|
images/flags/aw.png
ADDED
Binary file
|
images/flags/az.png
ADDED
Binary file
|
images/flags/ba.png
ADDED
Binary file
|
images/flags/bb.png
ADDED
Binary file
|
images/flags/bd.png
ADDED
Binary file
|
images/flags/be.png
ADDED
Binary file
|
images/flags/bf.png
ADDED
Binary file
|
images/flags/bg.png
ADDED
Binary file
|
images/flags/bh.png
ADDED
Binary file
|
images/flags/bi.png
ADDED
Binary file
|
images/flags/bj.png
ADDED
Binary file
|
images/flags/bm.png
ADDED
Binary file
|
images/flags/bn.png
ADDED
Binary file
|
images/flags/bo.png
ADDED
Binary file
|
images/flags/br.png
ADDED
Binary file
|
images/flags/bs.png
ADDED
Binary file
|
images/flags/bt.png
ADDED
Binary file
|
images/flags/bw.png
ADDED
Binary file
|
images/flags/by.png
ADDED
Binary file
|
images/flags/bz.png
ADDED
Binary file
|
images/flags/ca.png
ADDED
Binary file
|
images/flags/cc.png
ADDED
Binary file
|
images/flags/cd.png
ADDED
Binary file
|
images/flags/cf.png
ADDED
Binary file
|
images/flags/cg.png
ADDED
Binary file
|
images/flags/ch.png
ADDED
Binary file
|
images/flags/ci.png
ADDED
Binary file
|
images/flags/ck.png
ADDED
Binary file
|
images/flags/cl.png
ADDED
Binary file
|
images/flags/cm.png
ADDED
Binary file
|
images/flags/cn.png
ADDED
Binary file
|
images/flags/co.png
ADDED
Binary file
|
images/flags/cr.png
ADDED
Binary file
|
images/flags/cs.png
ADDED
Binary file
|
images/flags/cu.png
ADDED
Binary file
|
images/flags/cv.png
ADDED
Binary file
|
images/flags/cx.png
ADDED
Binary file
|
images/flags/cy.png
ADDED
Binary file
|
images/flags/cz.png
ADDED
Binary file
|
images/flags/de.png
ADDED
Binary file
|
images/flags/dh.png
ADDED
Binary file
|
images/flags/dj.png
ADDED
Binary file
|
images/flags/dk.png
ADDED
Binary file
|
images/flags/dm.png
ADDED
Binary file
|
images/flags/do.png
ADDED
Binary file
|
images/flags/dz.png
ADDED
Binary file
|
images/flags/ec.png
ADDED
Binary file
|
images/flags/ee.png
ADDED
Binary file
|
images/flags/eg.png
ADDED
Binary file
|
images/flags/eh.png
ADDED
Binary file
|
images/flags/er.png
ADDED
Binary file
|
images/flags/es.png
ADDED
Binary file
|
images/flags/et.png
ADDED
Binary file
|
images/flags/fi.png
ADDED
Binary file
|
images/flags/fj.png
ADDED
Binary file
|
images/flags/fk.png
ADDED
Binary file
|
images/flags/fm.png
ADDED
Binary file
|
images/flags/fr.png
ADDED
Binary file
|
images/flags/fx.png
ADDED
Binary file
|
images/flags/ga.png
ADDED
Binary file
|
images/flags/gb.png
ADDED
Binary file
|
images/flags/gd.png
ADDED
Binary file
|
images/flags/ge.png
ADDED
Binary file
|
images/flags/gf.png
ADDED
Binary file
|
images/flags/gh.png
ADDED
Binary file
|
images/flags/gi.png
ADDED
Binary file
|
images/flags/gl.png
ADDED
Binary file
|
images/flags/gm.png
ADDED
Binary file
|
images/flags/gn.png
ADDED
Binary file
|
images/flags/gp.png
ADDED
Binary file
|
images/flags/gq.png
ADDED
Binary file
|
images/flags/gr.png
ADDED
Binary file
|
images/flags/gt.png
ADDED
Binary file
|
images/flags/gu.png
ADDED
Binary file
|
images/flags/gw.png
ADDED
Binary file
|
images/flags/gy.png
ADDED
Binary file
|
images/flags/hk.png
ADDED
Binary file
|
images/flags/hm.png
ADDED
Binary file
|
images/flags/hn.png
ADDED
Binary file
|
images/flags/hr.png
ADDED
Binary file
|
images/flags/ht.png
ADDED
Binary file
|
images/flags/hu.png
ADDED
Binary file
|
images/flags/id.png
ADDED
Binary file
|
images/flags/ie.png
ADDED
Binary file
|
images/flags/il.png
ADDED
Binary file
|
images/flags/in.png
ADDED
Binary file
|
images/flags/io.png
ADDED
Binary file
|
images/flags/iq.png
ADDED
Binary file
|
images/flags/ir.png
ADDED
Binary file
|
images/flags/is.png
ADDED
Binary file
|
images/flags/it.png
ADDED
Binary file
|
images/flags/jm.png
ADDED
Binary file
|
images/flags/jo.png
ADDED
Binary file
|
images/flags/jp.png
ADDED
Binary file
|
images/flags/ke.png
ADDED
Binary file
|
images/flags/kg.png
ADDED
Binary file
|
images/flags/kh.png
ADDED
Binary file
|
images/flags/ki.png
ADDED
Binary file
|
images/flags/km.png
ADDED
Binary file
|
images/flags/kn.png
ADDED
Binary file
|
images/flags/kp.png
ADDED
Binary file
|
images/flags/kr.png
ADDED
Binary file
|
images/flags/ks.png
ADDED
Binary file
|
images/flags/kw.png
ADDED
Binary file
|
images/flags/ky.png
ADDED
Binary file
|
images/flags/kz.png
ADDED
Binary file
|
images/flags/la.png
ADDED
Binary file
|
images/flags/lb.png
ADDED
Binary file
|
images/flags/lc.png
ADDED
Binary file
|
images/flags/li.png
ADDED
Binary file
|
images/flags/lk.png
ADDED
Binary file
|
images/flags/lr.png
ADDED
Binary file
|
images/flags/ls.png
ADDED
Binary file
|
images/flags/lt.png
ADDED
Binary file
|
images/flags/lu.png
ADDED
Binary file
|
images/flags/lv.png
ADDED
Binary file
|
images/flags/ly.png
ADDED
Binary file
|
images/flags/ma.png
ADDED
Binary file
|
images/flags/mc.png
ADDED
Binary file
|
images/flags/md.png
ADDED
Binary file
|
images/flags/me.png
ADDED
Binary file
|
images/flags/mg.png
ADDED
Binary file
|
images/flags/mh.png
ADDED
Binary file
|
images/flags/mk.png
ADDED
Binary file
|
images/flags/ml.png
ADDED
Binary file
|
images/flags/mm.png
ADDED
Binary file
|
images/flags/mn.png
ADDED
Binary file
|
images/flags/mo.png
ADDED
Binary file
|
images/flags/mp.png
ADDED
Binary file
|
images/flags/mq.png
ADDED
Binary file
|
images/flags/mr.png
ADDED
Binary file
|
images/flags/ms.png
ADDED
Binary file
|
images/flags/mt.png
ADDED
Binary file
|
images/flags/mu.png
ADDED
Binary file
|
images/flags/mv.png
ADDED
Binary file
|
images/flags/mw.png
ADDED
Binary file
|
images/flags/mx.png
ADDED
Binary file
|
images/flags/my.png
ADDED
Binary file
|
images/flags/mz.png
ADDED
Binary file
|
images/flags/na.png
ADDED
Binary file
|
images/flags/nc.png
ADDED
Binary file
|
images/flags/ne.png
ADDED
Binary file
|
images/flags/nf.png
ADDED
Binary file
|
images/flags/ng.png
ADDED
Binary file
|
images/flags/ni.png
ADDED
Binary file
|
images/flags/nl.png
ADDED
Binary file
|
images/flags/no.png
ADDED
Binary file
|
images/flags/noFlag.png
ADDED
Binary file
|
images/flags/np.png
ADDED
Binary file
|
images/flags/nr.png
ADDED
Binary file
|
images/flags/nu.png
ADDED
Binary file
|
images/flags/nz.png
ADDED
Binary file
|
images/flags/om.png
ADDED
Binary file
|
images/flags/pa.png
ADDED
Binary file
|
images/flags/pe.png
ADDED
Binary file
|
images/flags/pf.png
ADDED
Binary file
|
images/flags/pg.png
ADDED
Binary file
|
images/flags/ph.png
ADDED
Binary file
|
images/flags/pk.png
ADDED
Binary file
|
images/flags/pl.png
ADDED
Binary file
|
images/flags/pm.png
ADDED
Binary file
|
images/flags/pn.png
ADDED
Binary file
|
images/flags/pr.png
ADDED
Binary file
|
images/flags/ps.png
ADDED
Binary file
|
images/flags/pt.png
ADDED
Binary file
|
images/flags/pw.png
ADDED
Binary file
|
images/flags/py.png
ADDED
Binary file
|
images/flags/qa.png
ADDED
Binary file
|
images/flags/re.png
ADDED
Binary file
|
images/flags/ro.png
ADDED
Binary file
|
images/flags/rs.png
ADDED
Binary file
|
images/flags/ru.png
ADDED
Binary file
|
images/flags/rw.png
ADDED
Binary file
|
images/flags/sa.png
ADDED
Binary file
|
images/flags/sb.png
ADDED
Binary file
|
images/flags/sc.png
ADDED
Binary file
|
images/flags/sd.png
ADDED
Binary file
|
images/flags/se.png
ADDED
Binary file
|
images/flags/sg.png
ADDED
Binary file
|
images/flags/sh.png
ADDED
Binary file
|
images/flags/si.png
ADDED
Binary file
|
images/flags/sj.png
ADDED
Binary file
|
images/flags/sk.png
ADDED
Binary file
|
images/flags/sl.png
ADDED
Binary file
|
images/flags/sm.png
ADDED
Binary file
|
images/flags/sn.png
ADDED
Binary file
|
images/flags/so.png
ADDED
Binary file
|
images/flags/sr.png
ADDED
Binary file
|
images/flags/st.png
ADDED
Binary file
|
images/flags/su.png
ADDED
Binary file
|
images/flags/sv.png
ADDED
Binary file
|
images/flags/sy.png
ADDED
Binary file
|
images/flags/sz.png
ADDED
Binary file
|
images/flags/tc.png
ADDED
Binary file
|
images/flags/td.png
ADDED
Binary file
|
images/flags/tf.png
ADDED
Binary file
|
images/flags/tg.png
ADDED
Binary file
|
images/flags/th.png
ADDED
Binary file
|
images/flags/tj.png
ADDED
Binary file
|
images/flags/tk.png
ADDED
Binary file
|
images/flags/tl.png
ADDED
Binary file
|
images/flags/tm.png
ADDED
Binary file
|
images/flags/tn.png
ADDED
Binary file
|
images/flags/to.png
ADDED
Binary file
|
images/flags/tp.png
ADDED
Binary file
|
images/flags/tr.png
ADDED
Binary file
|
images/flags/tt.png
ADDED
Binary file
|
images/flags/tv.png
ADDED
Binary file
|
images/flags/tw.png
ADDED
Binary file
|
images/flags/tz.png
ADDED
Binary file
|
images/flags/ua.png
ADDED
Binary file
|
images/flags/ug.png
ADDED
Binary file
|
images/flags/uk.png
ADDED
Binary file
|
images/flags/um.png
ADDED
Binary file
|
images/flags/us.png
ADDED
Binary file
|
images/flags/uy.png
ADDED
Binary file
|
images/flags/uz.png
ADDED
Binary file
|
images/flags/va.png
ADDED
Binary file
|
images/flags/vc.png
ADDED
Binary file
|
images/flags/ve.png
ADDED
Binary file
|
images/flags/vg.png
ADDED
Binary file
|
images/flags/vn.png
ADDED
Binary file
|
images/flags/vs.png
ADDED
Binary file
|
images/flags/vu.png
ADDED
Binary file
|
images/flags/wf.png
ADDED
Binary file
|
images/flags/ws.png
ADDED
Binary file
|
images/flags/xx.png
ADDED
Binary file
|
images/flags/ye.png
ADDED
Binary file
|
images/flags/yu.png
ADDED
Binary file
|
images/flags/za.png
ADDED
Binary file
|
images/flags/zm.png
ADDED
Binary file
|
images/flags/zr.png
ADDED
Binary file
|
images/flags/zw.png
ADDED
Binary file
|
images/headerbg.png
ADDED
Binary file
|
images/hitslogo.png
ADDED
Binary file
|
images/latestwords_nodata.png
ADDED
Binary file
|
images/myheaderbg.png
ADDED
Binary file
|
images/recent_nodata.png
ADDED
Binary file
|
images/se_nodata.png
ADDED
Binary file
|
images/search_engines/aol.png
ADDED
Binary file
|
images/search_engines/ask.png
ADDED
Binary file
|
images/search_engines/baiduspider.png
ADDED
Binary file
|
images/search_engines/bing.png
ADDED
Binary file
|
images/search_engines/dotmic.gif
ADDED
Binary file
|
images/search_engines/duckduckgo.png
ADDED
Binary file
|
images/search_engines/google.png
ADDED
Binary file
|
images/search_engines/webcrawler.gif
ADDED
Binary file
|
images/search_engines/yahoo.png
ADDED
Binary file
|
images/search_engines/yandex.png
ADDED
Binary file
|
images/topref_nodata.png
ADDED
Binary file
|
images/upgrade.png
ADDED
Binary file
|
images/upgrade1.jpg
ADDED
Binary file
|
images/upgrade2.jpg
ADDED
Binary file
|
images/upgrade3.jpg
ADDED
Binary file
|
images/upgrade4.jpg
ADDED
Binary file
|
images/upgradenow-button.png
ADDED
Binary file
|
images/vtrts.png
ADDED
Binary file
|
images/vtrts_ads.gif
ADDED
Binary file
|
images/vtrtspro.png
ADDED
Binary file
|
images/widget.png
ADDED
Binary file
|
init.php
ADDED
@@ -0,0 +1,49 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
define('AHC_DS', DIRECTORY_SEPARATOR);
|
4 |
+
define('AHC_PLUGIN_SUPDIRE_FILE', dirname(__FILE__).'WP_Stats_Plus.php');
|
5 |
+
|
6 |
+
require_once("settings.php");
|
7 |
+
require_once("WPHitsCounter.php");
|
8 |
+
|
9 |
+
register_activation_hook(AHC_PLUGIN_MAIN_FILE, 'ahc_set_default_options');
|
10 |
+
register_deactivation_hook(AHC_PLUGIN_MAIN_FILE, 'ahc_unset_default_options');
|
11 |
+
|
12 |
+
class Globals{
|
13 |
+
|
14 |
+
static $plugin_options = array();
|
15 |
+
static $lang = NULL;
|
16 |
+
static $post_type = NULL; // post | page | category
|
17 |
+
static $page_id = NULL;
|
18 |
+
static $page_title = NULL;
|
19 |
+
}
|
20 |
+
|
21 |
+
Globals::$plugin_options = get_option('ahc_wp_hits_counter_options');
|
22 |
+
Globals::$lang = 'en';
|
23 |
+
|
24 |
+
|
25 |
+
|
26 |
+
|
27 |
+
|
28 |
+
$admincore = '';
|
29 |
+
if (isset($_GET['page'])) $admincore = $_GET['page'];
|
30 |
+
if( is_admin() && $admincore == 'ahc_hits_counter_menu')
|
31 |
+
{
|
32 |
+
add_action('admin_enqueue_scripts', 'ahc_include_scripts');
|
33 |
+
}
|
34 |
+
|
35 |
+
//add_action('admin_bar_menu', 'vtrts_add_items', 90);
|
36 |
+
//$plugin = plugin_basename( __FILE__ );
|
37 |
+
//add_filter( "plugin_action_links_$plugin", 'vtrtsp_plugin_add_settings_link' );
|
38 |
+
|
39 |
+
|
40 |
+
|
41 |
+
add_action('parse_request', 'ahc_track_visitor', 1);
|
42 |
+
add_action('admin_menu', 'ahc_create_admin_menu_link');
|
43 |
+
|
44 |
+
// creating Ajax call for WordPress
|
45 |
+
add_action( 'wp_ajax_nopriv_ahc_HideMessageAjaxFunction', 'ahc_HideMessageAjaxFunction' );
|
46 |
+
add_action( 'wp_ajax_ahc_HideMessageAjaxFunction', 'ahc_HideMessageAjaxFunction' );
|
47 |
+
|
48 |
+
|
49 |
+
?>
|
js/js.js
ADDED
@@ -0,0 +1,183 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
|
2 |
+
var colors = ['#DB6946', '#C14543', '#445060', '#395953', '#6C8C80', '#829AB5', '#BF807A', '#BF0000', '#006BB7', '#EC732C', '#BF3D27', '#A6375F',
|
3 |
+
'#8C6D46', '#326149', '#802B35', '#8A3842', '#366D73', '#4D6173', '#4A4659', '#C9D65B', '#F45552', '#F3CC5E', '#F29B88', '#D96941',
|
4 |
+
'#484F73', '#C9AB81', '#F5655C', '#F0C480'];
|
5 |
+
//------------------------------------------------------------------------------
|
6 |
+
function convertToNumeric(data){
|
7 |
+
if(data instanceof Array){
|
8 |
+
for(var index in data){
|
9 |
+
data[index] = Number(data[index]);
|
10 |
+
}
|
11 |
+
} else{
|
12 |
+
data = Number(data);
|
13 |
+
}
|
14 |
+
return data;
|
15 |
+
}
|
16 |
+
//------------------------------------------------------------------------------
|
17 |
+
function getRandomElementFromArray(array){
|
18 |
+
var ranIndex = Math.floor(Math.random() * array.length);
|
19 |
+
return array[ranIndex];
|
20 |
+
}
|
21 |
+
//------------------------------------------------------------------------------
|
22 |
+
function drawVisitsLineChart(visitsData){
|
23 |
+
|
24 |
+
/*
|
25 |
+
|
26 |
+
|
27 |
+
var randomScalingFactor = function(){ return Math.round(Math.random()*100)};
|
28 |
+
|
29 |
+
var barChartData = {
|
30 |
+
labels : visitsData.data.dates,
|
31 |
+
datasets : [
|
32 |
+
{
|
33 |
+
label: "Visitors",
|
34 |
+
barShowStroke: false,
|
35 |
+
fillColor : "rgba(220,220,220,0.5)",
|
36 |
+
strokeColor : "rgba(220,220,220,0.8)",
|
37 |
+
highlightFill: "rgba(220,220,220,0.75)",
|
38 |
+
highlightStroke: "rgba(220,220,220,1)",
|
39 |
+
data : visitsData.data.visitors
|
40 |
+
},
|
41 |
+
{
|
42 |
+
label: "Visits",
|
43 |
+
barShowStroke: false,
|
44 |
+
fillColor : "rgba(151,187,205,0.5)",
|
45 |
+
strokeColor : "rgba(151,187,205,0.8)",
|
46 |
+
highlightFill : "rgba(151,187,205,0.75)",
|
47 |
+
highlightStroke : "rgba(151,187,205,1)",
|
48 |
+
data : visitsData.data.visits
|
49 |
+
}
|
50 |
+
]
|
51 |
+
|
52 |
+
}
|
53 |
+
var ctx = document.getElementById("visitorsVisitsChart").getContext("2d");
|
54 |
+
window.myBar = new Chart(ctx).Bar(barChartData, {
|
55 |
+
responsive : true,
|
56 |
+
animation:true,
|
57 |
+
scaleOverride:true,
|
58 |
+
scaleSteps:5,
|
59 |
+
scaleStartValue:0,
|
60 |
+
scaleStepWidth:10
|
61 |
+
});
|
62 |
+
*/
|
63 |
+
|
64 |
+
|
65 |
+
var randomScalingFactor = function(){ return Math.round(Math.random()*100)};
|
66 |
+
var lineChartData = {
|
67 |
+
labels : visitsData.data.dates,
|
68 |
+
datasets : [
|
69 |
+
{
|
70 |
+
label: "Visitors",
|
71 |
+
fillColor : "rgba(220,220,220,0.2)",
|
72 |
+
strokeColor : "rgba(220,220,220,1)",
|
73 |
+
pointColor : "rgba(220,220,220,1)",
|
74 |
+
pointStrokeColor : "#fff",
|
75 |
+
pointHighlightFill : "#fff",
|
76 |
+
pointHighlightStroke : "rgba(220,220,220,1)",
|
77 |
+
data : visitsData.data.visitors
|
78 |
+
},
|
79 |
+
{
|
80 |
+
label: "Visits",
|
81 |
+
fillColor : "rgba(151,187,205,0.2)",
|
82 |
+
strokeColor : "rgba(151,187,205,1)",
|
83 |
+
pointColor : "rgba(151,187,205,1)",
|
84 |
+
pointStrokeColor : "#fff",
|
85 |
+
pointHighlightFill : "#fff",
|
86 |
+
pointHighlightStroke : "rgba(151,187,205,1)",
|
87 |
+
data : visitsData.data.visits
|
88 |
+
}
|
89 |
+
]
|
90 |
+
|
91 |
+
}
|
92 |
+
|
93 |
+
window.onload = function(){
|
94 |
+
var ctx = document.getElementById("visitorsVisitsChart").getContext("2d");
|
95 |
+
window.myLine = new Chart(ctx).Line(lineChartData, {
|
96 |
+
responsive: true,
|
97 |
+
scaleOverride:false,
|
98 |
+
scaleSteps:5,
|
99 |
+
scaleStartValue:0,
|
100 |
+
scaleStepWidth:5
|
101 |
+
});
|
102 |
+
}
|
103 |
+
|
104 |
+
}
|
105 |
+
//------------------------------------------------------------------------------
|
106 |
+
function drawBrowsersBieChart(browsersData){
|
107 |
+
var brsBieChartData = [];
|
108 |
+
var container = jQuery('#browsersLegContainer');
|
109 |
+
var html = '';
|
110 |
+
if(browsersData.length == 0)
|
111 |
+
{
|
112 |
+
document.getElementById('browsersLegContainer').style.display = 'none';
|
113 |
+
}else{
|
114 |
+
document.getElementById('browsersLegContainer').style.display = 'block';
|
115 |
+
}
|
116 |
+
for(var i = 0; i < browsersData.length; i++){
|
117 |
+
var color = getRandomElementFromArray(colors);
|
118 |
+
var value = Number(browsersData[i].hits);
|
119 |
+
brsBieChartData[i] = {label: browsersData[i].bsr_name, value: value, color: color};
|
120 |
+
html += (isEmpty(value))? '' : '<div class="legend">' +
|
121 |
+
'<span class="color" style="background-color: ' + color + ';"> </span>' +
|
122 |
+
'<span class="name">' + browsersData[i].bsr_name + '</span>' +
|
123 |
+
'<span class="value">' + value + '</span>' +
|
124 |
+
'</div>';
|
125 |
+
}
|
126 |
+
html += '<div class="cleaner"></div>';
|
127 |
+
container.html(html);
|
128 |
+
var ctx = document.getElementById("brsBiechartContainer").getContext("2d");
|
129 |
+
window.myPie = new Chart(ctx).Pie(brsBieChartData);
|
130 |
+
}
|
131 |
+
//------------------------------------------------------------------------------
|
132 |
+
function drawSrhEngVstLineChart(srhEngVisitsData){
|
133 |
+
var srh_series = [];
|
134 |
+
var container = jQuery('#srchEngLegContainer');
|
135 |
+
|
136 |
+
document.getElementById('srchEngLegContainer').style.display = 'none';
|
137 |
+
var html = '';
|
138 |
+
for(var index in srhEngVisitsData.data.search_engines){
|
139 |
+
var color = getRandomElementFromArray(colors);
|
140 |
+
var value = countVisits(srhEngVisitsData.data.search_engines[index]);
|
141 |
+
|
142 |
+
if(parseFloat(value) !=0)
|
143 |
+
{
|
144 |
+
document.getElementById('srchEngLegContainer').style.display = 'block';
|
145 |
+
}
|
146 |
+
|
147 |
+
srh_series[srh_series.length] = {
|
148 |
+
"label": index,
|
149 |
+
"value": value,
|
150 |
+
"color": color
|
151 |
+
}
|
152 |
+
|
153 |
+
html += (isEmpty(value))? '' : '<div class="legend">' +
|
154 |
+
'<span class="color" style="background-color: ' + color + ';"> </span>' +
|
155 |
+
'<span class="name">' + index + '</span>' +
|
156 |
+
'<span class="value">' + value + '</span>' +
|
157 |
+
'</div>';
|
158 |
+
}
|
159 |
+
|
160 |
+
|
161 |
+
|
162 |
+
|
163 |
+
html += '<div class="cleaner"></div>';
|
164 |
+
container.html(html);
|
165 |
+
var ctx = document.getElementById("srhEngBieChartContainer").getContext("2d");
|
166 |
+
window.myPie = new Chart(ctx).Pie(srh_series);
|
167 |
+
}
|
168 |
+
|
169 |
+
function isEmpty(val){
|
170 |
+
return (val == null || val == 0 || val == '' || val == '0');
|
171 |
+
}
|
172 |
+
|
173 |
+
//------------------------------------------------------------------------------
|
174 |
+
function countVisits(arr){
|
175 |
+
var count = 0;
|
176 |
+
for(var i = 0; i < arr.length; i++){
|
177 |
+
count += Number(arr[i]);
|
178 |
+
}
|
179 |
+
return count;
|
180 |
+
}
|
181 |
+
//------------------------------------------------------------------------------
|
182 |
+
|
183 |
+
|
lang/ar_lang.php
ADDED
@@ -0,0 +1,48 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
define('ahc_summary_statistics', 'إحصائية موجزة');
|
4 |
+
define('ahc_visitors', 'الزوار');
|
5 |
+
define('ahc_visits', 'المشاهدات');
|
6 |
+
define('ahc_today', 'اليوم');
|
7 |
+
define('ahc_yesterday', 'الأمس');
|
8 |
+
define('ahc_this_week', 'هذ الأسبوع');
|
9 |
+
define('ahc_this_month', 'هذا الشهر');
|
10 |
+
define('ahc_this_yesr', 'هذا العام');
|
11 |
+
define('ahc_total', 'المجموع');
|
12 |
+
|
13 |
+
define('ahc_search_engines', 'محركات البحث');
|
14 |
+
define('ahc_daily_total', 'المجموع اليومي');
|
15 |
+
|
16 |
+
define('ahc_browsers', 'المتصفحات');
|
17 |
+
|
18 |
+
define('ahc_refering_sites', 'أكثر المواقع المشيرة للموقع');
|
19 |
+
define('ahc_total_times', 'عدد المرات');
|
20 |
+
define('ahc_site_name', 'إسم الموقع');
|
21 |
+
|
22 |
+
define('ahc_countries_visits_rank', 'ترتيب الدول حسب الزوار');
|
23 |
+
define('ahc_country', 'الدولة');
|
24 |
+
define('ahc_rank', 'الترتيب');
|
25 |
+
define('ahc_flag', 'العلم');
|
26 |
+
|
27 |
+
define('ahc_recent_visitors', 'اخر الزوار');
|
28 |
+
|
29 |
+
define('ahc_latest_search_words', 'أخر الكلمات المستخدمة في البحث');
|
30 |
+
|
31 |
+
define('ahc_today_visitors_on_map', 'زوار اليوم على الخريطة');
|
32 |
+
|
33 |
+
define('ahc_visits_in_last_20days', 'المشاهدات في اخر '.AHC_VISITORS_VISITS_LIMIT.' يوم');
|
34 |
+
define('ahc_no_visits_visitors', 'عدد الزوار والزيارات');
|
35 |
+
define('ahc_search_engines_in_last_20days', 'محركات البحث بالنسبة للزيارات في اخر 20 يوم');
|
36 |
+
|
37 |
+
define('traffic_by_title', 'الزيارات بالنسبة للمواضيع');
|
38 |
+
define('ahc_title', 'العنوان');
|
39 |
+
define('ahc_hits', 'المشاهدات');
|
40 |
+
define('ahc_percent', 'النسبة');
|
41 |
+
|
42 |
+
define('ahc_visits_time_graph', 'أوقات الزيارات');
|
43 |
+
define('ahc_time', 'الوقت');
|
44 |
+
define('ahc_visitors_graph', 'الزوار');
|
45 |
+
define('ahc_pages', 'الصفجات');
|
46 |
+
|
47 |
+
define('ahc_view_referer', 'عرض الرابط المشير');
|
48 |
+
?>
|
lang/en_lang.php
ADDED
@@ -0,0 +1,48 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
define('ahc_summary_statistics', 'Summary Statistics');
|
4 |
+
define('ahc_visitors', 'Visitors');
|
5 |
+
define('ahc_visits', 'Visits');
|
6 |
+
define('ahc_today', 'Today');
|
7 |
+
define('ahc_yesterday', 'Yesterday');
|
8 |
+
define('ahc_this_week', 'This Week');
|
9 |
+
define('ahc_this_month', 'This Month');
|
10 |
+
define('ahc_this_yesr', 'This Year');
|
11 |
+
define('ahc_total', 'Total');
|
12 |
+
|
13 |
+
define('ahc_search_engines', 'Search Engines');
|
14 |
+
define('ahc_daily_total', 'Daily Total');
|
15 |
+
|
16 |
+
define('ahc_browsers', 'Browsers');
|
17 |
+
|
18 |
+
define('ahc_refering_sites', 'Top Refering Sites');
|
19 |
+
define('ahc_total_times', 'Total Times');
|
20 |
+
define('ahc_site_name', 'Site Name');
|
21 |
+
|
22 |
+
define('ahc_countries_visits_rank', 'Countries Rank in Order to Visitors');
|
23 |
+
define('ahc_country', 'Country');
|
24 |
+
define('ahc_rank', 'Rank');
|
25 |
+
define('ahc_flag', 'Flag');
|
26 |
+
|
27 |
+
define('ahc_recent_visitors', 'Recent Visitors');
|
28 |
+
|
29 |
+
define('ahc_latest_search_words', 'Latest Search Words');
|
30 |
+
|
31 |
+
define('ahc_today_visitors_on_map', 'Today Visitors on Map');
|
32 |
+
|
33 |
+
define('ahc_visits_in_last_20days', 'Visits in the last '.AHC_VISITORS_VISITS_LIMIT.' days');
|
34 |
+
define('ahc_no_visits_visitors', 'Number of visitors and visits');
|
35 |
+
define('ahc_search_engines_in_last_20days', 'Referrer search engine in the last 20 days');
|
36 |
+
|
37 |
+
define('traffic_by_title', 'Traffic by title');
|
38 |
+
define('ahc_title', 'Title');
|
39 |
+
define('ahc_hits', 'Hits');
|
40 |
+
define('ahc_percent', 'Percent');
|
41 |
+
|
42 |
+
define('ahc_visits_time_graph', 'Visits time graph');
|
43 |
+
define('ahc_time', 'Time');
|
44 |
+
define('ahc_visitors_graph', 'Visitors graph');
|
45 |
+
define('ahc_pages', 'Pages');
|
46 |
+
|
47 |
+
define('ahc_view_referer', 'View referer link');
|
48 |
+
?>
|
lang/js/ar_lang.js
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
|
2 |
+
var ahc_visitors = 'الزوار';
|
3 |
+
var ahc_visits = 'المشاهدات';
|
4 |
+
var ahc_no_visits_visitors = 'عدد الزوار والزيارات';
|
5 |
+
var ahc_no_visits = 'عدد الزيارات';
|
lang/js/en_lang.js
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
|
2 |
+
var ahc_visitors = 'Visitors';
|
3 |
+
var ahc_visits = 'Visits';
|
4 |
+
var ahc_no_visits_visitors = 'Number of visitors and visits';
|
5 |
+
var ahc_no_visits = 'Number of visits';
|
lib/Chart_js/.gitignore
ADDED
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
|
2 |
+
.DS_Store
|
3 |
+
|
4 |
+
node_modules/*
|
5 |
+
custom/*
|
6 |
+
|
7 |
+
docs/index.md
|
lib/Chart_js/CONTRIBUTING.md
ADDED
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Contributing
|
2 |
+
============
|
3 |
+
|
4 |
+
New contributions to the library are welcome, just a couple of guidelines:
|
5 |
+
|
6 |
+
* Tabs for indentation, not spaces please.
|
7 |
+
* Please ensure you're changing the individual files in /src, not the concatenated output in the Chart.js file in the root of the repo.
|
8 |
+
* Please check that your code will pass jshint code standards, `gulp jshint` will run this for you.
|
9 |
+
* Please keep pull requests concise, and document new functionality in the relevant .md file.
|
10 |
+
* Consider whether your changes are useful for all users, or if creating a Chart.js extension would be more appropriate.
|
11 |
+
* Please avoid committing in the build Chart.js & Chart.min.js file, as it causes conflicts when merging.
|
12 |
+
|
13 |
+
New Chart Types
|
14 |
+
===============
|
15 |
+
|
16 |
+
Chart.js is designed to be modular. See http://www.chartjs.org/docs/#advanced-usage-writing-new-chart-types
|
17 |
+
|
18 |
+
All discussion of new chart types (horizontal bar charts, X-Y scatter plot, etc.) should be done in the Chart.js Google Group at https://groups.google.com/forum/#!forum/chartjs-user-discussion This will get the most exposure for getting people to help define requirements, complete programming and documentation of your vision.
|
19 |
+
|
20 |
+
Please do not request new chart types in the project issues. Fully implemented, documented, and useful new charts may be maintained in a new repository. Later, we may add a link to selected external repositories from this project.
|
lib/Chart_js/Chart.js
ADDED
@@ -0,0 +1,3379 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*!
|
2 |
+
* Chart.js
|
3 |
+
* http://chartjs.org/
|
4 |
+
* Version: 1.0.1-beta.4
|
5 |
+
*
|
6 |
+
* Copyright 2014 Nick Downie
|
7 |
+
* Released under the MIT license
|
8 |
+
* https://github.com/nnnick/Chart.js/blob/master/LICENSE.md
|
9 |
+
*/
|
10 |
+
|
11 |
+
|
12 |
+
(function(){
|
13 |
+
|
14 |
+
"use strict";
|
15 |
+
|
16 |
+
//Declare root variable - window in the browser, global on the server
|
17 |
+
var root = this,
|
18 |
+
previous = root.Chart;
|
19 |
+
|
20 |
+
//Occupy the global variable of Chart, and create a simple base class
|
21 |
+
var Chart = function(context){
|
22 |
+
var chart = this;
|
23 |
+
this.canvas = context.canvas;
|
24 |
+
|
25 |
+
this.ctx = context;
|
26 |
+
|
27 |
+
//Variables global to the chart
|
28 |
+
var width = this.width = context.canvas.width;
|
29 |
+
var height = this.height = context.canvas.height;
|
30 |
+
this.aspectRatio = this.width / this.height;
|
31 |
+
//High pixel density displays - multiply the size of the canvas height/width by the device pixel ratio, then scale.
|
32 |
+
helpers.retinaScale(this);
|
33 |
+
|
34 |
+
return this;
|
35 |
+
};
|
36 |
+
//Globally expose the defaults to allow for user updating/changing
|
37 |
+
Chart.defaults = {
|
38 |
+
global: {
|
39 |
+
// Boolean - Whether to animate the chart
|
40 |
+
animation: true,
|
41 |
+
|
42 |
+
// Number - Number of animation steps
|
43 |
+
animationSteps: 60,
|
44 |
+
|
45 |
+
// String - Animation easing effect
|
46 |
+
animationEasing: "easeOutQuart",
|
47 |
+
|
48 |
+
// Boolean - If we should show the scale at all
|
49 |
+
showScale: true,
|
50 |
+
|
51 |
+
// Boolean - If we want to override with a hard coded scale
|
52 |
+
scaleOverride: false,
|
53 |
+
|
54 |
+
// ** Required if scaleOverride is true **
|
55 |
+
// Number - The number of steps in a hard coded scale
|
56 |
+
scaleSteps: null,
|
57 |
+
// Number - The value jump in the hard coded scale
|
58 |
+
scaleStepWidth: null,
|
59 |
+
// Number - The scale starting value
|
60 |
+
scaleStartValue: null,
|
61 |
+
|
62 |
+
// String - Colour of the scale line
|
63 |
+
scaleLineColor: "rgba(0,0,0,.1)",
|
64 |
+
|
65 |
+
// Number - Pixel width of the scale line
|
66 |
+
scaleLineWidth: 1,
|
67 |
+
|
68 |
+
// Boolean - Whether to show labels on the scale
|
69 |
+
scaleShowLabels: true,
|
70 |
+
|
71 |
+
// Interpolated JS string - can access value
|
72 |
+
scaleLabel: "<%=value%>",
|
73 |
+
|
74 |
+
// Boolean - Whether the scale should stick to integers, and not show any floats even if drawing space is there
|
75 |
+
scaleIntegersOnly: true,
|
76 |
+
|
77 |
+
// Boolean - Whether the scale should start at zero, or an order of magnitude down from the lowest value
|
78 |
+
scaleBeginAtZero: false,
|
79 |
+
|
80 |
+
// String - Scale label font declaration for the scale label
|
81 |
+
scaleFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",
|
82 |
+
|
83 |
+
// Number - Scale label font size in pixels
|
84 |
+
scaleFontSize: 12,
|
85 |
+
|
86 |
+
// String - Scale label font weight style
|
87 |
+
scaleFontStyle: "normal",
|
88 |
+
|
89 |
+
// String - Scale label font colour
|
90 |
+
scaleFontColor: "#666",
|
91 |
+
|
92 |
+
// Boolean - whether or not the chart should be responsive and resize when the browser does.
|
93 |
+
responsive: false,
|
94 |
+
|
95 |
+
// Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container
|
96 |
+
maintainAspectRatio: true,
|
97 |
+
|
98 |
+
// Boolean - Determines whether to draw tooltips on the canvas or not - attaches events to touchmove & mousemove
|
99 |
+
showTooltips: true,
|
100 |
+
|
101 |
+
// Array - Array of string names to attach tooltip events
|
102 |
+
tooltipEvents: ["mousemove", "touchstart", "touchmove", "mouseout"],
|
103 |
+
|
104 |
+
// String - Tooltip background colour
|
105 |
+
tooltipFillColor: "rgba(0,0,0,0.8)",
|
106 |
+
|
107 |
+
// String - Tooltip label font declaration for the scale label
|
108 |
+
tooltipFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",
|
109 |
+
|
110 |
+
// Number - Tooltip label font size in pixels
|
111 |
+
tooltipFontSize: 14,
|
112 |
+
|
113 |
+
// String - Tooltip font weight style
|
114 |
+
tooltipFontStyle: "normal",
|
115 |
+
|
116 |
+
// String - Tooltip label font colour
|
117 |
+
tooltipFontColor: "#fff",
|
118 |
+
|
119 |
+
// String - Tooltip title font declaration for the scale label
|
120 |
+
tooltipTitleFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",
|
121 |
+
|
122 |
+
// Number - Tooltip title font size in pixels
|
123 |
+
tooltipTitleFontSize: 14,
|
124 |
+
|
125 |
+
// String - Tooltip title font weight style
|
126 |
+
tooltipTitleFontStyle: "bold",
|
127 |
+
|
128 |
+
// String - Tooltip title font colour
|
129 |
+
tooltipTitleFontColor: "#fff",
|
130 |
+
|
131 |
+
// Number - pixel width of padding around tooltip text
|
132 |
+
tooltipYPadding: 6,
|
133 |
+
|
134 |
+
// Number - pixel width of padding around tooltip text
|
135 |
+
tooltipXPadding: 6,
|
136 |
+
|
137 |
+
// Number - Size of the caret on the tooltip
|
138 |
+
tooltipCaretSize: 8,
|
139 |
+
|
140 |
+
// Number - Pixel radius of the tooltip border
|
141 |
+
tooltipCornerRadius: 6,
|
142 |
+
|
143 |
+
// Number - Pixel offset from point x to tooltip edge
|
144 |
+
tooltipXOffset: 10,
|
145 |
+
|
146 |
+
// String - Template string for single tooltips
|
147 |
+
tooltipTemplate: "<%if (label){%><%=label%>: <%}%><%= value %>",
|
148 |
+
|
149 |
+
// String - Template string for single tooltips
|
150 |
+
multiTooltipTemplate: "<%= value %>",
|
151 |
+
|
152 |
+
// String - Colour behind the legend colour block
|
153 |
+
multiTooltipKeyBackground: '#fff',
|
154 |
+
|
155 |
+
// Function - Will fire on animation progression.
|
156 |
+
onAnimationProgress: function(){},
|
157 |
+
|
158 |
+
// Function - Will fire on animation completion.
|
159 |
+
onAnimationComplete: function(){}
|
160 |
+
|
161 |
+
}
|
162 |
+
};
|
163 |
+
|
164 |
+
//Create a dictionary of chart types, to allow for extension of existing types
|
165 |
+
Chart.types = {};
|
166 |
+
|
167 |
+
//Global Chart helpers object for utility methods and classes
|
168 |
+
var helpers = Chart.helpers = {};
|
169 |
+
|
170 |
+
//-- Basic js utility methods
|
171 |
+
var each = helpers.each = function(loopable,callback,self){
|
172 |
+
var additionalArgs = Array.prototype.slice.call(arguments, 3);
|
173 |
+
// Check to see if null or undefined firstly.
|
174 |
+
if (loopable){
|
175 |
+
if (loopable.length === +loopable.length){
|
176 |
+
var i;
|
177 |
+
for (i=0; i<loopable.length; i++){
|
178 |
+
callback.apply(self,[loopable[i], i].concat(additionalArgs));
|
179 |
+
}
|
180 |
+
}
|
181 |
+
else{
|
182 |
+
for (var item in loopable){
|
183 |
+
callback.apply(self,[loopable[item],item].concat(additionalArgs));
|
184 |
+
}
|
185 |
+
}
|
186 |
+
}
|
187 |
+
},
|
188 |
+
clone = helpers.clone = function(obj){
|
189 |
+
var objClone = {};
|
190 |
+
each(obj,function(value,key){
|
191 |
+
if (obj.hasOwnProperty(key)) objClone[key] = value;
|
192 |
+
});
|
193 |
+
return objClone;
|
194 |
+
},
|
195 |
+
extend = helpers.extend = function(base){
|
196 |
+
each(Array.prototype.slice.call(arguments,1), function(extensionObject) {
|
197 |
+
each(extensionObject,function(value,key){
|
198 |
+
if (extensionObject.hasOwnProperty(key)) base[key] = value;
|
199 |
+
});
|
200 |
+
});
|
201 |
+
return base;
|
202 |
+
},
|
203 |
+
merge = helpers.merge = function(base,master){
|
204 |
+
//Merge properties in left object over to a shallow clone of object right.
|
205 |
+
var args = Array.prototype.slice.call(arguments,0);
|
206 |
+
args.unshift({});
|
207 |
+
return extend.apply(null, args);
|
208 |
+
},
|
209 |
+
indexOf = helpers.indexOf = function(arrayToSearch, item){
|
210 |
+
if (Array.prototype.indexOf) {
|
211 |
+
return arrayToSearch.indexOf(item);
|
212 |
+
}
|
213 |
+
else{
|
214 |
+
for (var i = 0; i < arrayToSearch.length; i++) {
|
215 |
+
if (arrayToSearch[i] === item) return i;
|
216 |
+
}
|
217 |
+
return -1;
|
218 |
+
}
|
219 |
+
},
|
220 |
+
where = helpers.where = function(collection, filterCallback){
|
221 |
+
var filtered = [];
|
222 |
+
|
223 |
+
helpers.each(collection, function(item){
|
224 |
+
if (filterCallback(item)){
|
225 |
+
filtered.push(item);
|
226 |
+
}
|
227 |
+
});
|
228 |
+
|
229 |
+
return filtered;
|
230 |
+
},
|
231 |
+
findNextWhere = helpers.findNextWhere = function(arrayToSearch, filterCallback, startIndex){
|
232 |
+
// Default to start of the array
|
233 |
+
if (!startIndex){
|
234 |
+
startIndex = -1;
|
235 |
+
}
|
236 |
+
for (var i = startIndex + 1; i < arrayToSearch.length; i++) {
|
237 |
+
var currentItem = arrayToSearch[i];
|
238 |
+
if (filterCallback(currentItem)){
|
239 |
+
return currentItem;
|
240 |
+
}
|
241 |
+
};
|
242 |
+
},
|
243 |
+
findPreviousWhere = helpers.findPreviousWhere = function(arrayToSearch, filterCallback, startIndex){
|
244 |
+
// Default to end of the array
|
245 |
+
if (!startIndex){
|
246 |
+
startIndex = arrayToSearch.length;
|
247 |
+
}
|
248 |
+
for (var i = startIndex - 1; i >= 0; i--) {
|
249 |
+
var currentItem = arrayToSearch[i];
|
250 |
+
if (filterCallback(currentItem)){
|
251 |
+
return currentItem;
|
252 |
+
}
|
253 |
+
};
|
254 |
+
},
|
255 |
+
inherits = helpers.inherits = function(extensions){
|
256 |
+
//Basic javascript inheritance based on the model created in Backbone.js
|
257 |
+
var parent = this;
|
258 |
+
var ChartElement = (extensions && extensions.hasOwnProperty("constructor")) ? extensions.constructor : function(){ return parent.apply(this, arguments); };
|
259 |
+
|
260 |
+
var Surrogate = function(){ this.constructor = ChartElement;};
|
261 |
+
Surrogate.prototype = parent.prototype;
|
262 |
+
ChartElement.prototype = new Surrogate();
|
263 |
+
|
264 |
+
ChartElement.extend = inherits;
|
265 |
+
|
266 |
+
if (extensions) extend(ChartElement.prototype, extensions);
|
267 |
+
|
268 |
+
ChartElement.__super__ = parent.prototype;
|
269 |
+
|
270 |
+
return ChartElement;
|
271 |
+
},
|
272 |
+
noop = helpers.noop = function(){},
|
273 |
+
uid = helpers.uid = (function(){
|
274 |
+
var id=0;
|
275 |
+
return function(){
|
276 |
+
return "chart-" + id++;
|
277 |
+
};
|
278 |
+
})(),
|
279 |
+
warn = helpers.warn = function(str){
|
280 |
+
//Method for warning of errors
|
281 |
+
if (window.console && typeof window.console.warn == "function") console.warn(str);
|
282 |
+
},
|
283 |
+
amd = helpers.amd = (typeof define == 'function' && define.amd),
|
284 |
+
//-- Math methods
|
285 |
+
isNumber = helpers.isNumber = function(n){
|
286 |
+
return !isNaN(parseFloat(n)) && isFinite(n);
|
287 |
+
},
|
288 |
+
max = helpers.max = function(array){
|
289 |
+
return Math.max.apply( Math, array );
|
290 |
+
},
|
291 |
+
min = helpers.min = function(array){
|
292 |
+
return Math.min.apply( Math, array );
|
293 |
+
},
|
294 |
+
cap = helpers.cap = function(valueToCap,maxValue,minValue){
|
295 |
+
if(isNumber(maxValue)) {
|
296 |
+
if( valueToCap > maxValue ) {
|
297 |
+
return maxValue;
|
298 |
+
}
|
299 |
+
}
|
300 |
+
else if(isNumber(minValue)){
|
301 |
+
if ( valueToCap < minValue ){
|
302 |
+
return minValue;
|
303 |
+
}
|
304 |
+
}
|
305 |
+
return valueToCap;
|
306 |
+
},
|
307 |
+
getDecimalPlaces = helpers.getDecimalPlaces = function(num){
|
308 |
+
if (num%1!==0 && isNumber(num)){
|
309 |
+
return num.toString().split(".")[1].length;
|
310 |
+
}
|
311 |
+
else {
|
312 |
+
return 0;
|
313 |
+
}
|
314 |
+
},
|
315 |
+
toRadians = helpers.radians = function(degrees){
|
316 |
+
return degrees * (Math.PI/180);
|
317 |
+
},
|
318 |
+
// Gets the angle from vertical upright to the point about a centre.
|
319 |
+
getAngleFromPoint = helpers.getAngleFromPoint = function(centrePoint, anglePoint){
|
320 |
+
var distanceFromXCenter = anglePoint.x - centrePoint.x,
|
321 |
+
distanceFromYCenter = anglePoint.y - centrePoint.y,
|
322 |
+
radialDistanceFromCenter = Math.sqrt( distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);
|
323 |
+
|
324 |
+
|
325 |
+
var angle = Math.PI * 2 + Math.atan2(distanceFromYCenter, distanceFromXCenter);
|
326 |
+
|
327 |
+
//If the segment is in the top left quadrant, we need to add another rotation to the angle
|
328 |
+
if (distanceFromXCenter < 0 && distanceFromYCenter < 0){
|
329 |
+
angle += Math.PI*2;
|
330 |
+
}
|
331 |
+
|
332 |
+
return {
|
333 |
+
angle: angle,
|
334 |
+
distance: radialDistanceFromCenter
|
335 |
+
};
|
336 |
+
},
|
337 |
+
aliasPixel = helpers.aliasPixel = function(pixelWidth){
|
338 |
+
return (pixelWidth % 2 === 0) ? 0 : 0.5;
|
339 |
+
},
|
340 |
+
splineCurve = helpers.splineCurve = function(FirstPoint,MiddlePoint,AfterPoint,t){
|
341 |
+
//Props to Rob Spencer at scaled innovation for his post on splining between points
|
342 |
+
//http://scaledinnovation.com/analytics/splines/aboutSplines.html
|
343 |
+
var d01=Math.sqrt(Math.pow(MiddlePoint.x-FirstPoint.x,2)+Math.pow(MiddlePoint.y-FirstPoint.y,2)),
|
344 |
+
d12=Math.sqrt(Math.pow(AfterPoint.x-MiddlePoint.x,2)+Math.pow(AfterPoint.y-MiddlePoint.y,2)),
|
345 |
+
fa=t*d01/(d01+d12),// scaling factor for triangle Ta
|
346 |
+
fb=t*d12/(d01+d12);
|
347 |
+
return {
|
348 |
+
inner : {
|
349 |
+
x : MiddlePoint.x-fa*(AfterPoint.x-FirstPoint.x),
|
350 |
+
y : MiddlePoint.y-fa*(AfterPoint.y-FirstPoint.y)
|
351 |
+
},
|
352 |
+
outer : {
|
353 |
+
x: MiddlePoint.x+fb*(AfterPoint.x-FirstPoint.x),
|
354 |
+
y : MiddlePoint.y+fb*(AfterPoint.y-FirstPoint.y)
|
355 |
+
}
|
356 |
+
};
|
357 |
+
},
|
358 |
+
calculateOrderOfMagnitude = helpers.calculateOrderOfMagnitude = function(val){
|
359 |
+
return Math.floor(Math.log(val) / Math.LN10);
|
360 |
+
},
|
361 |
+
calculateScaleRange = helpers.calculateScaleRange = function(valuesArray, drawingSize, textSize, startFromZero, integersOnly){
|
362 |
+
|
363 |
+
//Set a minimum step of two - a point at the top of the graph, and a point at the base
|
364 |
+
var minSteps = 2,
|
365 |
+
maxSteps = Math.floor(drawingSize/(textSize * 1.5)),
|
366 |
+
skipFitting = (minSteps >= maxSteps);
|
367 |
+
|
368 |
+
var maxValue = max(valuesArray),
|
369 |
+
minValue = min(valuesArray);
|
370 |
+
|
371 |
+
// We need some degree of seperation here to calculate the scales if all the values are the same
|
372 |
+
// Adding/minusing 0.5 will give us a range of 1.
|
373 |
+
if (maxValue === minValue){
|
374 |
+
maxValue += 0.5;
|
375 |
+
// So we don't end up with a graph with a negative start value if we've said always start from zero
|
376 |
+
if (minValue >= 0.5 && !startFromZero){
|
377 |
+
minValue -= 0.5;
|
378 |
+
}
|
379 |
+
else{
|
380 |
+
// Make up a whole number above the values
|
381 |
+
maxValue += 0.5;
|
382 |
+
}
|
383 |
+
}
|
384 |
+
|
385 |
+
var valueRange = Math.abs(maxValue - minValue),
|
386 |
+
rangeOrderOfMagnitude = calculateOrderOfMagnitude(valueRange),
|
387 |
+
graphMax = Math.ceil(maxValue / (1 * Math.pow(10, rangeOrderOfMagnitude))) * Math.pow(10, rangeOrderOfMagnitude),
|
388 |
+
graphMin = (startFromZero) ? 0 : Math.floor(minValue / (1 * Math.pow(10, rangeOrderOfMagnitude))) * Math.pow(10, rangeOrderOfMagnitude),
|
389 |
+
graphRange = graphMax - graphMin,
|
390 |
+
stepValue = Math.pow(10, rangeOrderOfMagnitude),
|
391 |
+
numberOfSteps = Math.round(graphRange / stepValue);
|
392 |
+
|
393 |
+
//If we have more space on the graph we'll use it to give more definition to the data
|
394 |
+
while((numberOfSteps > maxSteps || (numberOfSteps * 2) < maxSteps) && !skipFitting) {
|
395 |
+
if(numberOfSteps > maxSteps){
|
396 |
+
stepValue *=2;
|
397 |
+
numberOfSteps = Math.round(graphRange/stepValue);
|
398 |
+
// Don't ever deal with a decimal number of steps - cancel fitting and just use the minimum number of steps.
|
399 |
+
if (numberOfSteps % 1 !== 0){
|
400 |
+
skipFitting = true;
|
401 |
+
}
|
402 |
+
}
|
403 |
+
//We can fit in double the amount of scale points on the scale
|
404 |
+
else{
|
405 |
+
//If user has declared ints only, and the step value isn't a decimal
|
406 |
+
if (integersOnly && rangeOrderOfMagnitude >= 0){
|
407 |
+
//If the user has said integers only, we need to check that making the scale more granular wouldn't make it a float
|
408 |
+
if(stepValue/2 % 1 === 0){
|
409 |
+
stepValue /=2;
|
410 |
+
numberOfSteps = Math.round(graphRange/stepValue);
|
411 |
+
}
|
412 |
+
//If it would make it a float break out of the loop
|
413 |
+
else{
|
414 |
+
break;
|
415 |
+
}
|
416 |
+
}
|
417 |
+
//If the scale doesn't have to be an int, make the scale more granular anyway.
|
418 |
+
else{
|
419 |
+
stepValue /=2;
|
420 |
+
numberOfSteps = Math.round(graphRange/stepValue);
|
421 |
+
}
|
422 |
+
|
423 |
+
}
|
424 |
+
}
|
425 |
+
|
426 |
+
if (skipFitting){
|
427 |
+
numberOfSteps = minSteps;
|
428 |
+
stepValue = graphRange / numberOfSteps;
|
429 |
+
}
|
430 |
+
|
431 |
+
return {
|
432 |
+
steps : numberOfSteps,
|
433 |
+
stepValue : stepValue,
|
434 |
+
min : graphMin,
|
435 |
+
max : graphMin + (numberOfSteps * stepValue)
|
436 |
+
};
|
437 |
+
|
438 |
+
},
|
439 |
+
/* jshint ignore:start */
|
440 |
+
// Blows up jshint errors based on the new Function constructor
|
441 |
+
//Templating methods
|
442 |
+
//Javascript micro templating by John Resig - source at http://ejohn.org/blog/javascript-micro-templating/
|
443 |
+
template = helpers.template = function(templateString, valuesObject){
|
444 |
+
// If templateString is function rather than string-template - call the function for valuesObject
|
445 |
+
if(templateString instanceof Function){
|
446 |
+
return templateString(valuesObject);
|
447 |
+
}
|
448 |
+
|
449 |
+
var cache = {};
|
450 |
+
function tmpl(str, data){
|
451 |
+
// Figure out if we're getting a template, or if we need to
|
452 |
+
// load the template - and be sure to cache the result.
|
453 |
+
var fn = !/\W/.test(str) ?
|
454 |
+
cache[str] = cache[str] :
|
455 |
+
|
456 |
+
// Generate a reusable function that will serve as a template
|
457 |
+
// generator (and which will be cached).
|
458 |
+
new Function("obj",
|
459 |
+
"var p=[],print=function(){p.push.apply(p,arguments);};" +
|
460 |
+
|
461 |
+
// Introduce the data as local variables using with(){}
|
462 |
+
"with(obj){p.push('" +
|
463 |
+
|
464 |
+
// Convert the template into pure JavaScript
|
465 |
+
str
|
466 |
+
.replace(/[\r\t\n]/g, " ")
|
467 |
+
.split("<%").join("\t")
|
468 |
+
.replace(/((^|%>)[^\t]*)'/g, "$1\r")
|
469 |
+
.replace(/\t=(.*?)%>/g, "',$1,'")
|
470 |
+
.split("\t").join("');")
|
471 |
+
.split("%>").join("p.push('")
|
472 |
+
.split("\r").join("\\'") +
|
473 |
+
"');}return p.join('');"
|
474 |
+
);
|
475 |
+
|
476 |
+
// Provide some basic currying to the user
|
477 |
+
return data ? fn( data ) : fn;
|
478 |
+
}
|
479 |
+
return tmpl(templateString,valuesObject);
|
480 |
+
},
|
481 |
+
/* jshint ignore:end */
|
482 |
+
generateLabels = helpers.generateLabels = function(templateString,numberOfSteps,graphMin,stepValue){
|
483 |
+
var labelsArray = new Array(numberOfSteps);
|
484 |
+
if (labelTemplateString){
|
485 |
+
each(labelsArray,function(val,index){
|
486 |
+
labelsArray[index] = template(templateString,{value: (graphMin + (stepValue*(index+1)))});
|
487 |
+
});
|
488 |
+
}
|
489 |
+
return labelsArray;
|
490 |
+
},
|
491 |
+
//--Animation methods
|
492 |
+
//Easing functions adapted from Robert Penner's easing equations
|
493 |
+
//http://www.robertpenner.com/easing/
|
494 |
+
easingEffects = helpers.easingEffects = {
|
495 |
+
linear: function (t) {
|
496 |
+
return t;
|
497 |
+
},
|
498 |
+
easeInQuad: function (t) {
|
499 |
+
return t * t;
|
500 |
+
},
|
501 |
+
easeOutQuad: function (t) {
|
502 |
+
return -1 * t * (t - 2);
|
503 |
+
},
|
504 |
+
easeInOutQuad: function (t) {
|
505 |
+
if ((t /= 1 / 2) < 1) return 1 / 2 * t * t;
|
506 |
+
return -1 / 2 * ((--t) * (t - 2) - 1);
|
507 |
+
},
|
508 |
+
easeInCubic: function (t) {
|
509 |
+
return t * t * t;
|
510 |
+
},
|
511 |
+
easeOutCubic: function (t) {
|
512 |
+
return 1 * ((t = t / 1 - 1) * t * t + 1);
|
513 |
+
},
|
514 |
+
easeInOutCubic: function (t) {
|
515 |
+
if ((t /= 1 / 2) < 1) return 1 / 2 * t * t * t;
|
516 |
+
return 1 / 2 * ((t -= 2) * t * t + 2);
|
517 |
+
},
|
518 |
+
easeInQuart: function (t) {
|
519 |
+
return t * t * t * t;
|
520 |
+
},
|
521 |
+
easeOutQuart: function (t) {
|
522 |
+
return -1 * ((t = t / 1 - 1) * t * t * t - 1);
|
523 |
+
},
|
524 |
+
easeInOutQuart: function (t) {
|
525 |
+
if ((t /= 1 / 2) < 1) return 1 / 2 * t * t * t * t;
|
526 |
+
return -1 / 2 * ((t -= 2) * t * t * t - 2);
|
527 |
+
},
|
528 |
+
easeInQuint: function (t) {
|
529 |
+
return 1 * (t /= 1) * t * t * t * t;
|
530 |
+
},
|
531 |
+
easeOutQuint: function (t) {
|
532 |
+
return 1 * ((t = t / 1 - 1) * t * t * t * t + 1);
|
533 |
+
},
|
534 |
+
easeInOutQuint: function (t) {
|
535 |
+
if ((t /= 1 / 2) < 1) return 1 / 2 * t * t * t * t * t;
|
536 |
+
return 1 / 2 * ((t -= 2) * t * t * t * t + 2);
|
537 |
+
},
|
538 |
+
easeInSine: function (t) {
|
539 |
+
return -1 * Math.cos(t / 1 * (Math.PI / 2)) + 1;
|
540 |
+
},
|
541 |
+
easeOutSine: function (t) {
|
542 |
+
return 1 * Math.sin(t / 1 * (Math.PI / 2));
|
543 |
+
},
|
544 |
+
easeInOutSine: function (t) {
|
545 |
+
return -1 / 2 * (Math.cos(Math.PI * t / 1) - 1);
|
546 |
+
},
|
547 |
+
easeInExpo: function (t) {
|
548 |
+
return (t === 0) ? 1 : 1 * Math.pow(2, 10 * (t / 1 - 1));
|
549 |
+
},
|
550 |
+
easeOutExpo: function (t) {
|
551 |
+
return (t === 1) ? 1 : 1 * (-Math.pow(2, -10 * t / 1) + 1);
|
552 |
+
},
|
553 |
+
easeInOutExpo: function (t) {
|
554 |
+
if (t === 0) return 0;
|
555 |
+
if (t === 1) return 1;
|
556 |
+
if ((t /= 1 / 2) < 1) return 1 / 2 * Math.pow(2, 10 * (t - 1));
|
557 |
+
return 1 / 2 * (-Math.pow(2, -10 * --t) + 2);
|
558 |
+
},
|
559 |
+
easeInCirc: function (t) {
|
560 |
+
if (t >= 1) return t;
|
561 |
+
return -1 * (Math.sqrt(1 - (t /= 1) * t) - 1);
|
562 |
+
},
|
563 |
+
easeOutCirc: function (t) {
|
564 |
+
return 1 * Math.sqrt(1 - (t = t / 1 - 1) * t);
|
565 |
+
},
|
566 |
+
easeInOutCirc: function (t) {
|
567 |
+
if ((t /= 1 / 2) < 1) return -1 / 2 * (Math.sqrt(1 - t * t) - 1);
|
568 |
+
return 1 / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1);
|
569 |
+
},
|
570 |
+
easeInElastic: function (t) {
|
571 |
+
var s = 1.70158;
|
572 |
+
var p = 0;
|
573 |
+
var a = 1;
|
574 |
+
if (t === 0) return 0;
|
575 |
+
if ((t /= 1) == 1) return 1;
|
576 |
+
if (!p) p = 1 * 0.3;
|
577 |
+
if (a < Math.abs(1)) {
|
578 |
+
a = 1;
|
579 |
+
s = p / 4;
|
580 |
+
} else s = p / (2 * Math.PI) * Math.asin(1 / a);
|
581 |
+
return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p));
|
582 |
+
},
|
583 |
+
easeOutElastic: function (t) {
|
584 |
+
var s = 1.70158;
|
585 |
+
var p = 0;
|
586 |
+
var a = 1;
|
587 |
+
if (t === 0) return 0;
|
588 |
+
if ((t /= 1) == 1) return 1;
|
589 |
+
if (!p) p = 1 * 0.3;
|
590 |
+
if (a < Math.abs(1)) {
|
591 |
+
a = 1;
|
592 |
+
s = p / 4;
|
593 |
+
} else s = p / (2 * Math.PI) * Math.asin(1 / a);
|
594 |
+
return a * Math.pow(2, -10 * t) * Math.sin((t * 1 - s) * (2 * Math.PI) / p) + 1;
|
595 |
+
},
|
596 |
+
easeInOutElastic: function (t) {
|
597 |
+
var s = 1.70158;
|
598 |
+
var p = 0;
|
599 |
+
var a = 1;
|
600 |
+
if (t === 0) return 0;
|
601 |
+
if ((t /= 1 / 2) == 2) return 1;
|
602 |
+
if (!p) p = 1 * (0.3 * 1.5);
|
603 |
+
if (a < Math.abs(1)) {
|
604 |
+
a = 1;
|
605 |
+
s = p / 4;
|
606 |
+
} else s = p / (2 * Math.PI) * Math.asin(1 / a);
|
607 |
+
if (t < 1) return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p));
|
608 |
+
return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p) * 0.5 + 1;
|
609 |
+
},
|
610 |
+
easeInBack: function (t) {
|
611 |
+
var s = 1.70158;
|
612 |
+
return 1 * (t /= 1) * t * ((s + 1) * t - s);
|
613 |
+
},
|
614 |
+
easeOutBack: function (t) {
|
615 |
+
var s = 1.70158;
|
616 |
+
return 1 * ((t = t / 1 - 1) * t * ((s + 1) * t + s) + 1);
|
617 |
+
},
|
618 |
+
easeInOutBack: function (t) {
|
619 |
+
var s = 1.70158;
|
620 |
+
if ((t /= 1 / 2) < 1) return 1 / 2 * (t * t * (((s *= (1.525)) + 1) * t - s));
|
621 |
+
return 1 / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);
|
622 |
+
},
|
623 |
+
easeInBounce: function (t) {
|
624 |
+
return 1 - easingEffects.easeOutBounce(1 - t);
|
625 |
+
},
|
626 |
+
easeOutBounce: function (t) {
|
627 |
+
if ((t /= 1) < (1 / 2.75)) {
|
628 |
+
return 1 * (7.5625 * t * t);
|
629 |
+
} else if (t < (2 / 2.75)) {
|
630 |
+
return 1 * (7.5625 * (t -= (1.5 / 2.75)) * t + 0.75);
|
631 |
+
} else if (t < (2.5 / 2.75)) {
|
632 |
+
return 1 * (7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375);
|
633 |
+
} else {
|
634 |
+
return 1 * (7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375);
|
635 |
+
}
|
636 |
+
},
|
637 |
+
easeInOutBounce: function (t) {
|
638 |
+
if (t < 1 / 2) return easingEffects.easeInBounce(t * 2) * 0.5;
|
639 |
+
return easingEffects.easeOutBounce(t * 2 - 1) * 0.5 + 1 * 0.5;
|
640 |
+
}
|
641 |
+
},
|
642 |
+
//Request animation polyfill - http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/
|
643 |
+
requestAnimFrame = helpers.requestAnimFrame = (function(){
|
644 |
+
return window.requestAnimationFrame ||
|
645 |
+
window.webkitRequestAnimationFrame ||
|
646 |
+
window.mozRequestAnimationFrame ||
|
647 |
+
window.oRequestAnimationFrame ||
|
648 |
+
window.msRequestAnimationFrame ||
|
649 |
+
function(callback) {
|
650 |
+
return window.setTimeout(callback, 1000 / 60);
|
651 |
+
};
|
652 |
+
})(),
|
653 |
+
cancelAnimFrame = helpers.cancelAnimFrame = (function(){
|
654 |
+
return window.cancelAnimationFrame ||
|
655 |
+
window.webkitCancelAnimationFrame ||
|
656 |
+
window.mozCancelAnimationFrame ||
|
657 |
+
window.oCancelAnimationFrame ||
|
658 |
+
window.msCancelAnimationFrame ||
|
659 |
+
function(callback) {
|
660 |
+
return window.clearTimeout(callback, 1000 / 60);
|
661 |
+
};
|
662 |
+
})(),
|
663 |
+
animationLoop = helpers.animationLoop = function(callback,totalSteps,easingString,onProgress,onComplete,chartInstance){
|
664 |
+
|
665 |
+
var currentStep = 0,
|
666 |
+
easingFunction = easingEffects[easingString] || easingEffects.linear;
|
667 |
+
|
668 |
+
var animationFrame = function(){
|
669 |
+
currentStep++;
|
670 |
+
var stepDecimal = currentStep/totalSteps;
|
671 |
+
var easeDecimal = easingFunction(stepDecimal);
|
672 |
+
|
673 |
+
callback.call(chartInstance,easeDecimal,stepDecimal, currentStep);
|
674 |
+
onProgress.call(chartInstance,easeDecimal,stepDecimal);
|
675 |
+
if (currentStep < totalSteps){
|
676 |
+
chartInstance.animationFrame = requestAnimFrame(animationFrame);
|
677 |
+
} else{
|
678 |
+
onComplete.apply(chartInstance);
|
679 |
+
}
|
680 |
+
};
|
681 |
+
requestAnimFrame(animationFrame);
|
682 |
+
},
|
683 |
+
//-- DOM methods
|
684 |
+
getRelativePosition = helpers.getRelativePosition = function(evt){
|
685 |
+
var mouseX, mouseY;
|
686 |
+
var e = evt.originalEvent || evt,
|
687 |
+
canvas = evt.currentTarget || evt.srcElement,
|
688 |
+
boundingRect = canvas.getBoundingClientRect();
|
689 |
+
|
690 |
+
if (e.touches){
|
691 |
+
mouseX = e.touches[0].clientX - boundingRect.left;
|
692 |
+
mouseY = e.touches[0].clientY - boundingRect.top;
|
693 |
+
|
694 |
+
}
|
695 |
+
else{
|
696 |
+
mouseX = e.clientX - boundingRect.left;
|
697 |
+
mouseY = e.clientY - boundingRect.top;
|
698 |
+
}
|
699 |
+
|
700 |
+
return {
|
701 |
+
x : mouseX,
|
702 |
+
y : mouseY
|
703 |
+
};
|
704 |
+
|
705 |
+
},
|
706 |
+
addEvent = helpers.addEvent = function(node,eventType,method){
|
707 |
+
if (node.addEventListener){
|
708 |
+
node.addEventListener(eventType,method);
|
709 |
+
} else if (node.attachEvent){
|
710 |
+
node.attachEvent("on"+eventType, method);
|
711 |
+
} else {
|
712 |
+
node["on"+eventType] = method;
|
713 |
+
}
|
714 |
+
},
|
715 |
+
removeEvent = helpers.removeEvent = function(node, eventType, handler){
|
716 |
+
if (node.removeEventListener){
|
717 |
+
node.removeEventListener(eventType, handler, false);
|
718 |
+
} else if (node.detachEvent){
|
719 |
+
node.detachEvent("on"+eventType,handler);
|
720 |
+
} else{
|
721 |
+
node["on" + eventType] = noop;
|
722 |
+
}
|
723 |
+
},
|
724 |
+
bindEvents = helpers.bindEvents = function(chartInstance, arrayOfEvents, handler){
|
725 |
+
// Create the events object if it's not already present
|
726 |
+
if (!chartInstance.events) chartInstance.events = {};
|
727 |
+
|
728 |
+
each(arrayOfEvents,function(eventName){
|
729 |
+
chartInstance.events[eventName] = function(){
|
730 |
+
handler.apply(chartInstance, arguments);
|
731 |
+
};
|
732 |
+
addEvent(chartInstance.chart.canvas,eventName,chartInstance.events[eventName]);
|
733 |
+
});
|
734 |
+
},
|
735 |
+
unbindEvents = helpers.unbindEvents = function (chartInstance, arrayOfEvents) {
|
736 |
+
each(arrayOfEvents, function(handler,eventName){
|
737 |
+
removeEvent(chartInstance.chart.canvas, eventName, handler);
|
738 |
+
});
|
739 |
+
},
|
740 |
+
getMaximumWidth = helpers.getMaximumWidth = function(domNode){
|
741 |
+
var container = domNode.parentNode;
|
742 |
+
// TODO = check cross browser stuff with this.
|
743 |
+
return container.clientWidth;
|
744 |
+
},
|
745 |
+
getMaximumHeight = helpers.getMaximumHeight = function(domNode){
|
746 |
+
var container = domNode.parentNode;
|
747 |
+
// TODO = check cross browser stuff with this.
|
748 |
+
return container.clientHeight;
|
749 |
+
},
|
750 |
+
getMaximumSize = helpers.getMaximumSize = helpers.getMaximumWidth, // legacy support
|
751 |
+
retinaScale = helpers.retinaScale = function(chart){
|
752 |
+
var ctx = chart.ctx,
|
753 |
+
width = chart.canvas.width,
|
754 |
+
height = chart.canvas.height;
|
755 |
+
|
756 |
+
if (window.devicePixelRatio) {
|
757 |
+
ctx.canvas.style.width = width + "px";
|
758 |
+
ctx.canvas.style.height = height + "px";
|
759 |
+
ctx.canvas.height = height * window.devicePixelRatio;
|
760 |
+
ctx.canvas.width = width * window.devicePixelRatio;
|
761 |
+
ctx.scale(window.devicePixelRatio, window.devicePixelRatio);
|
762 |
+
}
|
763 |
+
},
|
764 |
+
//-- Canvas methods
|
765 |
+
clear = helpers.clear = function(chart){
|
766 |
+
chart.ctx.clearRect(0,0,chart.width,chart.height);
|
767 |
+
},
|
768 |
+
fontString = helpers.fontString = function(pixelSize,fontStyle,fontFamily){
|
769 |
+
return fontStyle + " " + pixelSize+"px " + fontFamily;
|
770 |
+
},
|
771 |
+
longestText = helpers.longestText = function(ctx,font,arrayOfStrings){
|
772 |
+
ctx.font = font;
|
773 |
+
var longest = 0;
|
774 |
+
each(arrayOfStrings,function(string){
|
775 |
+
var textWidth = ctx.measureText(string).width;
|
776 |
+
longest = (textWidth > longest) ? textWidth : longest;
|
777 |
+
});
|
778 |
+
return longest;
|
779 |
+
},
|
780 |
+
drawRoundedRectangle = helpers.drawRoundedRectangle = function(ctx,x,y,width,height,radius){
|
781 |
+
ctx.beginPath();
|
782 |
+
ctx.moveTo(x + radius, y);
|
783 |
+
ctx.lineTo(x + width - radius, y);
|
784 |
+
ctx.quadraticCurveTo(x + width, y, x + width, y + radius);
|
785 |
+
ctx.lineTo(x + width, y + height - radius);
|
786 |
+
ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);
|
787 |
+
ctx.lineTo(x + radius, y + height);
|
788 |
+
ctx.quadraticCurveTo(x, y + height, x, y + height - radius);
|
789 |
+
ctx.lineTo(x, y + radius);
|
790 |
+
ctx.quadraticCurveTo(x, y, x + radius, y);
|
791 |
+
ctx.closePath();
|
792 |
+
};
|
793 |
+
|
794 |
+
|
795 |
+
//Store a reference to each instance - allowing us to globally resize chart instances on window resize.
|
796 |
+
//Destroy method on the chart will remove the instance of the chart from this reference.
|
797 |
+
Chart.instances = {};
|
798 |
+
|
799 |
+
Chart.Type = function(data,options,chart){
|
800 |
+
this.options = options;
|
801 |
+
this.chart = chart;
|
802 |
+
this.id = uid();
|
803 |
+
//Add the chart instance to the global namespace
|
804 |
+
Chart.instances[this.id] = this;
|
805 |
+
|
806 |
+
// Initialize is always called when a chart type is created
|
807 |
+
// By default it is a no op, but it should be extended
|
808 |
+
if (options.responsive){
|
809 |
+
this.resize();
|
810 |
+
}
|
811 |
+
this.initialize.call(this,data);
|
812 |
+
};
|
813 |
+
|
814 |
+
//Core methods that'll be a part of every chart type
|
815 |
+
extend(Chart.Type.prototype,{
|
816 |
+
initialize : function(){return this;},
|
817 |
+
clear : function(){
|
818 |
+
clear(this.chart);
|
819 |
+
return this;
|
820 |
+
},
|
821 |
+
stop : function(){
|
822 |
+
// Stops any current animation loop occuring
|
823 |
+
helpers.cancelAnimFrame.call(root, this.animationFrame);
|
824 |
+
return this;
|
825 |
+
},
|
826 |
+
resize : function(callback){
|
827 |
+
this.stop();
|
828 |
+
var canvas = this.chart.canvas,
|
829 |
+
newWidth = getMaximumWidth(this.chart.canvas),
|
830 |
+
newHeight = this.options.maintainAspectRatio ? newWidth / this.chart.aspectRatio : getMaximumHeight(this.chart.canvas);
|
831 |
+
|
832 |
+
canvas.width = this.chart.width = newWidth;
|
833 |
+
canvas.height = this.chart.height = newHeight;
|
834 |
+
|
835 |
+
retinaScale(this.chart);
|
836 |
+
|
837 |
+
if (typeof callback === "function"){
|
838 |
+
callback.apply(this, Array.prototype.slice.call(arguments, 1));
|
839 |
+
}
|
840 |
+
return this;
|
841 |
+
},
|
842 |
+
reflow : noop,
|
843 |
+
render : function(reflow){
|
844 |
+
if (reflow){
|
845 |
+
this.reflow();
|
846 |
+
}
|
847 |
+
if (this.options.animation && !reflow){
|
848 |
+
helpers.animationLoop(
|
849 |
+
this.draw,
|
850 |
+
this.options.animationSteps,
|
851 |
+
this.options.animationEasing,
|
852 |
+
this.options.onAnimationProgress,
|
853 |
+
this.options.onAnimationComplete,
|
854 |
+
this
|
855 |
+
);
|
856 |
+
}
|
857 |
+
else{
|
858 |
+
this.draw();
|
859 |
+
this.options.onAnimationComplete.call(this);
|
860 |
+
}
|
861 |
+
return this;
|
862 |
+
},
|
863 |
+
generateLegend : function(){
|
864 |
+
return template(this.options.legendTemplate,this);
|
865 |
+
},
|
866 |
+
destroy : function(){
|
867 |
+
this.clear();
|
868 |
+
unbindEvents(this, this.events);
|
869 |
+
delete Chart.instances[this.id];
|
870 |
+
},
|
871 |
+
showTooltip : function(ChartElements, forceRedraw){
|
872 |
+
// Only redraw the chart if we've actually changed what we're hovering on.
|
873 |
+
if (typeof this.activeElements === 'undefined') this.activeElements = [];
|
874 |
+
|
875 |
+
var isChanged = (function(Elements){
|
876 |
+
var changed = false;
|
877 |
+
|
878 |
+
if (Elements.length !== this.activeElements.length){
|
879 |
+
changed = true;
|
880 |
+
return changed;
|
881 |
+
}
|
882 |
+
|
883 |
+
each(Elements, function(element, index){
|
884 |
+
if (element !== this.activeElements[index]){
|
885 |
+
changed = true;
|
886 |
+
}
|
887 |
+
}, this);
|
888 |
+
return changed;
|
889 |
+
}).call(this, ChartElements);
|
890 |
+
|
891 |
+
if (!isChanged && !forceRedraw){
|
892 |
+
return;
|
893 |
+
}
|
894 |
+
else{
|
895 |
+
this.activeElements = ChartElements;
|
896 |
+
}
|
897 |
+
this.draw();
|
898 |
+
if (ChartElements.length > 0){
|
899 |
+
// If we have multiple datasets, show a MultiTooltip for all of the data points at that index
|
900 |
+
if (this.datasets && this.datasets.length > 1) {
|
901 |
+
var dataArray,
|
902 |
+
dataIndex;
|
903 |
+
|
904 |
+
for (var i = this.datasets.length - 1; i >= 0; i--) {
|
905 |
+
dataArray = this.datasets[i].points || this.datasets[i].bars || this.datasets[i].segments;
|
906 |
+
dataIndex = indexOf(dataArray, ChartElements[0]);
|
907 |
+
if (dataIndex !== -1){
|
908 |
+
break;
|
909 |
+
}
|
910 |
+
}
|
911 |
+
var tooltipLabels = [],
|
912 |
+
tooltipColors = [],
|
913 |
+
medianPosition = (function(index) {
|
914 |
+
|
915 |
+
// Get all the points at that particular index
|
916 |
+
var Elements = [],
|
917 |
+
dataCollection,
|
918 |
+
xPositions = [],
|
919 |
+
yPositions = [],
|
920 |
+
xMax,
|
921 |
+
yMax,
|
922 |
+
xMin,
|
923 |
+
yMin;
|
924 |
+
helpers.each(this.datasets, function(dataset){
|
925 |
+
dataCollection = dataset.points || dataset.bars || dataset.segments;
|
926 |
+
if (dataCollection[dataIndex] && dataCollection[dataIndex].hasValue()){
|
927 |
+
Elements.push(dataCollection[dataIndex]);
|
928 |
+
}
|
929 |
+
});
|
930 |
+
|
931 |
+
helpers.each(Elements, function(element) {
|
932 |
+
xPositions.push(element.x);
|
933 |
+
yPositions.push(element.y);
|
934 |
+
|
935 |
+
|
936 |
+
//Include any colour information about the element
|
937 |
+
tooltipLabels.push(helpers.template(this.options.multiTooltipTemplate, element));
|
938 |
+
tooltipColors.push({
|
939 |
+
fill: element._saved.fillColor || element.fillColor,
|
940 |
+
stroke: element._saved.strokeColor || element.strokeColor
|
941 |
+
});
|
942 |
+
|
943 |
+
}, this);
|
944 |
+
|
945 |
+
yMin = min(yPositions);
|
946 |
+
yMax = max(yPositions);
|
947 |
+
|
948 |
+
xMin = min(xPositions);
|
949 |
+
xMax = max(xPositions);
|
950 |
+
|
951 |
+
return {
|
952 |
+
x: (xMin > this.chart.width/2) ? xMin : xMax,
|
953 |
+
y: (yMin + yMax)/2
|
954 |
+
};
|
955 |
+
}).call(this, dataIndex);
|
956 |
+
|
957 |
+
new Chart.MultiTooltip({
|
958 |
+
x: medianPosition.x,
|
959 |
+
y: medianPosition.y,
|
960 |
+
xPadding: this.options.tooltipXPadding,
|
961 |
+
yPadding: this.options.tooltipYPadding,
|
962 |
+
xOffset: this.options.tooltipXOffset,
|
963 |
+
fillColor: this.options.tooltipFillColor,
|
964 |
+
textColor: this.options.tooltipFontColor,
|
965 |
+
fontFamily: this.options.tooltipFontFamily,
|
966 |
+
fontStyle: this.options.tooltipFontStyle,
|
967 |
+
fontSize: this.options.tooltipFontSize,
|
968 |
+
titleTextColor: this.options.tooltipTitleFontColor,
|
969 |
+
titleFontFamily: this.options.tooltipTitleFontFamily,
|
970 |
+
titleFontStyle: this.options.tooltipTitleFontStyle,
|
971 |
+
titleFontSize: this.options.tooltipTitleFontSize,
|
972 |
+
cornerRadius: this.options.tooltipCornerRadius,
|
973 |
+
labels: tooltipLabels,
|
974 |
+
legendColors: tooltipColors,
|
975 |
+
legendColorBackground : this.options.multiTooltipKeyBackground,
|
976 |
+
title: ChartElements[0].label,
|
977 |
+
chart: this.chart,
|
978 |
+
ctx: this.chart.ctx
|
979 |
+
}).draw();
|
980 |
+
|
981 |
+
} else {
|
982 |
+
each(ChartElements, function(Element) {
|
983 |
+
var tooltipPosition = Element.tooltipPosition();
|
984 |
+
new Chart.Tooltip({
|
985 |
+
x: Math.round(tooltipPosition.x),
|
986 |
+
y: Math.round(tooltipPosition.y),
|
987 |
+
xPadding: this.options.tooltipXPadding,
|
988 |
+
yPadding: this.options.tooltipYPadding,
|
989 |
+
fillColor: this.options.tooltipFillColor,
|
990 |
+
textColor: this.options.tooltipFontColor,
|
991 |
+
fontFamily: this.options.tooltipFontFamily,
|
992 |
+
fontStyle: this.options.tooltipFontStyle,
|
993 |
+
fontSize: this.options.tooltipFontSize,
|
994 |
+
caretHeight: this.options.tooltipCaretSize,
|
995 |
+
cornerRadius: this.options.tooltipCornerRadius,
|
996 |
+
text: template(this.options.tooltipTemplate, Element),
|
997 |
+
chart: this.chart
|
998 |
+
}).draw();
|
999 |
+
}, this);
|
1000 |
+
}
|
1001 |
+
}
|
1002 |
+
return this;
|
1003 |
+
},
|
1004 |
+
toBase64Image : function(){
|
1005 |
+
return this.chart.canvas.toDataURL.apply(this.chart.canvas, arguments);
|
1006 |
+
}
|
1007 |
+
});
|
1008 |
+
|
1009 |
+
Chart.Type.extend = function(extensions){
|
1010 |
+
|
1011 |
+
var parent = this;
|
1012 |
+
|
1013 |
+
var ChartType = function(){
|
1014 |
+
return parent.apply(this,arguments);
|
1015 |
+
};
|
1016 |
+
|
1017 |
+
//Copy the prototype object of the this class
|
1018 |
+
ChartType.prototype = clone(parent.prototype);
|
1019 |
+
//Now overwrite some of the properties in the base class with the new extensions
|
1020 |
+
extend(ChartType.prototype, extensions);
|
1021 |
+
|
1022 |
+
ChartType.extend = Chart.Type.extend;
|
1023 |
+
|
1024 |
+
if (extensions.name || parent.prototype.name){
|
1025 |
+
|
1026 |
+
var chartName = extensions.name || parent.prototype.name;
|
1027 |
+
//Assign any potential default values of the new chart type
|
1028 |
+
|
1029 |
+
//If none are defined, we'll use a clone of the chart type this is being extended from.
|
1030 |
+
//I.e. if we extend a line chart, we'll use the defaults from the line chart if our new chart
|
1031 |
+
//doesn't define some defaults of their own.
|
1032 |
+
|
1033 |
+
var baseDefaults = (Chart.defaults[parent.prototype.name]) ? clone(Chart.defaults[parent.prototype.name]) : {};
|
1034 |
+
|
1035 |
+
Chart.defaults[chartName] = extend(baseDefaults,extensions.defaults);
|
1036 |
+
|
1037 |
+
Chart.types[chartName] = ChartType;
|
1038 |
+
|
1039 |
+
//Register this new chart type in the Chart prototype
|
1040 |
+
Chart.prototype[chartName] = function(data,options){
|
1041 |
+
var config = merge(Chart.defaults.global, Chart.defaults[chartName], options || {});
|
1042 |
+
return new ChartType(data,config,this);
|
1043 |
+
};
|
1044 |
+
} else{
|
1045 |
+
warn("Name not provided for this chart, so it hasn't been registered");
|
1046 |
+
}
|
1047 |
+
return parent;
|
1048 |
+
};
|
1049 |
+
|
1050 |
+
Chart.Element = function(configuration){
|
1051 |
+
extend(this,configuration);
|
1052 |
+
this.initialize.apply(this,arguments);
|
1053 |
+
this.save();
|
1054 |
+
};
|
1055 |
+
extend(Chart.Element.prototype,{
|
1056 |
+
initialize : function(){},
|
1057 |
+
restore : function(props){
|
1058 |
+
if (!props){
|
1059 |
+
extend(this,this._saved);
|
1060 |
+
} else {
|
1061 |
+
each(props,function(key){
|
1062 |
+
this[key] = this._saved[key];
|
1063 |
+
},this);
|
1064 |
+
}
|
1065 |
+
return this;
|
1066 |
+
},
|
1067 |
+
save : function(){
|
1068 |
+
this._saved = clone(this);
|
1069 |
+
delete this._saved._saved;
|
1070 |
+
return this;
|
1071 |
+
},
|
1072 |
+
update : function(newProps){
|
1073 |
+
each(newProps,function(value,key){
|
1074 |
+
this._saved[key] = this[key];
|
1075 |
+
this[key] = value;
|
1076 |
+
},this);
|
1077 |
+
return this;
|
1078 |
+
},
|
1079 |
+
transition : function(props,ease){
|
1080 |
+
each(props,function(value,key){
|
1081 |
+
this[key] = ((value - this._saved[key]) * ease) + this._saved[key];
|
1082 |
+
},this);
|
1083 |
+
return this;
|
1084 |
+
},
|
1085 |
+
tooltipPosition : function(){
|
1086 |
+
return {
|
1087 |
+
x : this.x,
|
1088 |
+
y : this.y
|
1089 |
+
};
|
1090 |
+
},
|
1091 |
+
hasValue: function(){
|
1092 |
+
return isNumber(this.value);
|
1093 |
+
}
|
1094 |
+
});
|
1095 |
+
|
1096 |
+
Chart.Element.extend = inherits;
|
1097 |
+
|
1098 |
+
|
1099 |
+
Chart.Point = Chart.Element.extend({
|
1100 |
+
display: true,
|
1101 |
+
inRange: function(chartX,chartY){
|
1102 |
+
var hitDetectionRange = this.hitDetectionRadius + this.radius;
|
1103 |
+
return ((Math.pow(chartX-this.x, 2)+Math.pow(chartY-this.y, 2)) < Math.pow(hitDetectionRange,2));
|
1104 |
+
},
|
1105 |
+
draw : function(){
|
1106 |
+
if (this.display){
|
1107 |
+
var ctx = this.ctx;
|
1108 |
+
ctx.beginPath();
|
1109 |
+
|
1110 |
+
ctx.arc(this.x, this.y, this.radius, 0, Math.PI*2);
|
1111 |
+
ctx.closePath();
|
1112 |
+
|
1113 |
+
ctx.strokeStyle = this.strokeColor;
|
1114 |
+
ctx.lineWidth = this.strokeWidth;
|
1115 |
+
|
1116 |
+
ctx.fillStyle = this.fillColor;
|
1117 |
+
|
1118 |
+
ctx.fill();
|
1119 |
+
ctx.stroke();
|
1120 |
+
}
|
1121 |
+
|
1122 |
+
|
1123 |
+
//Quick debug for bezier curve splining
|
1124 |
+
//Highlights control points and the line between them.
|
1125 |
+
//Handy for dev - stripped in the min version.
|
1126 |
+
|
1127 |
+
// ctx.save();
|
1128 |
+
// ctx.fillStyle = "black";
|
1129 |
+
// ctx.strokeStyle = "black"
|
1130 |
+
// ctx.beginPath();
|
1131 |
+
// ctx.arc(this.controlPoints.inner.x,this.controlPoints.inner.y, 2, 0, Math.PI*2);
|
1132 |
+
// ctx.fill();
|
1133 |
+
|
1134 |
+
// ctx.beginPath();
|
1135 |
+
// ctx.arc(this.controlPoints.outer.x,this.controlPoints.outer.y, 2, 0, Math.PI*2);
|
1136 |
+
// ctx.fill();
|
1137 |
+
|
1138 |
+
// ctx.moveTo(this.controlPoints.inner.x,this.controlPoints.inner.y);
|
1139 |
+
// ctx.lineTo(this.x, this.y);
|
1140 |
+
// ctx.lineTo(this.controlPoints.outer.x,this.controlPoints.outer.y);
|
1141 |
+
// ctx.stroke();
|
1142 |
+
|
1143 |
+
// ctx.restore();
|
1144 |
+
|
1145 |
+
|
1146 |
+
|
1147 |
+
}
|
1148 |
+
});
|
1149 |
+
|
1150 |
+
Chart.Arc = Chart.Element.extend({
|
1151 |
+
inRange : function(chartX,chartY){
|
1152 |
+
|
1153 |
+
var pointRelativePosition = helpers.getAngleFromPoint(this, {
|
1154 |
+
x: chartX,
|
1155 |
+
y: chartY
|
1156 |
+
});
|
1157 |
+
|
1158 |
+
//Check if within the range of the open/close angle
|
1159 |
+
var betweenAngles = (pointRelativePosition.angle >= this.startAngle && pointRelativePosition.angle <= this.endAngle),
|
1160 |
+
withinRadius = (pointRelativePosition.distance >= this.innerRadius && pointRelativePosition.distance <= this.outerRadius);
|
1161 |
+
|
1162 |
+
return (betweenAngles && withinRadius);
|
1163 |
+
//Ensure within the outside of the arc centre, but inside arc outer
|
1164 |
+
},
|
1165 |
+
tooltipPosition : function(){
|
1166 |
+
var centreAngle = this.startAngle + ((this.endAngle - this.startAngle) / 2),
|
1167 |
+
rangeFromCentre = (this.outerRadius - this.innerRadius) / 2 + this.innerRadius;
|
1168 |
+
return {
|
1169 |
+
x : this.x + (Math.cos(centreAngle) * rangeFromCentre),
|
1170 |
+
y : this.y + (Math.sin(centreAngle) * rangeFromCentre)
|
1171 |
+
};
|
1172 |
+
},
|
1173 |
+
draw : function(animationPercent){
|
1174 |
+
|
1175 |
+
var easingDecimal = animationPercent || 1;
|
1176 |
+
|
1177 |
+
var ctx = this.ctx;
|
1178 |
+
|
1179 |
+
ctx.beginPath();
|
1180 |
+
|
1181 |
+
ctx.arc(this.x, this.y, this.outerRadius, this.startAngle, this.endAngle);
|
1182 |
+
|
1183 |
+
ctx.arc(this.x, this.y, this.innerRadius, this.endAngle, this.startAngle, true);
|
1184 |
+
|
1185 |
+
ctx.closePath();
|
1186 |
+
ctx.strokeStyle = this.strokeColor;
|
1187 |
+
ctx.lineWidth = this.strokeWidth;
|
1188 |
+
|
1189 |
+
ctx.fillStyle = this.fillColor;
|
1190 |
+
|
1191 |
+
ctx.fill();
|
1192 |
+
ctx.lineJoin = 'bevel';
|
1193 |
+
|
1194 |
+
if (this.showStroke){
|
1195 |
+
ctx.stroke();
|
1196 |
+
}
|
1197 |
+
}
|
1198 |
+
});
|
1199 |
+
|
1200 |
+
Chart.Rectangle = Chart.Element.extend({
|
1201 |
+
draw : function(){
|
1202 |
+
var ctx = this.ctx,
|
1203 |
+
halfWidth = this.width/2,
|
1204 |
+
leftX = this.x - halfWidth,
|
1205 |
+
rightX = this.x + halfWidth,
|
1206 |
+
top = this.base - (this.base - this.y),
|
1207 |
+
halfStroke = this.strokeWidth / 2;
|
1208 |
+
|
1209 |
+
// Canvas doesn't allow us to stroke inside the width so we can
|
1210 |
+
// adjust the sizes to fit if we're setting a stroke on the line
|
1211 |
+
if (this.showStroke){
|
1212 |
+
leftX += halfStroke;
|
1213 |
+
rightX -= halfStroke;
|
1214 |
+
top += halfStroke;
|
1215 |
+
}
|
1216 |
+
|
1217 |
+
ctx.beginPath();
|
1218 |
+
|
1219 |
+
ctx.fillStyle = this.fillColor;
|
1220 |
+
ctx.strokeStyle = this.strokeColor;
|
1221 |
+
ctx.lineWidth = this.strokeWidth;
|
1222 |
+
|
1223 |
+
// It'd be nice to keep this class totally generic to any rectangle
|
1224 |
+
// and simply specify which border to miss out.
|
1225 |
+
ctx.moveTo(leftX, this.base);
|
1226 |
+
ctx.lineTo(leftX, top);
|
1227 |
+
ctx.lineTo(rightX, top);
|
1228 |
+
ctx.lineTo(rightX, this.base);
|
1229 |
+
ctx.fill();
|
1230 |
+
if (this.showStroke){
|
1231 |
+
ctx.stroke();
|
1232 |
+
}
|
1233 |
+
},
|
1234 |
+
height : function(){
|
1235 |
+
return this.base - this.y;
|
1236 |
+
},
|
1237 |
+
inRange : function(chartX,chartY){
|
1238 |
+
return (chartX >= this.x - this.width/2 && chartX <= this.x + this.width/2) && (chartY >= this.y && chartY <= this.base);
|
1239 |
+
}
|
1240 |
+
});
|
1241 |
+
|
1242 |
+
Chart.Tooltip = Chart.Element.extend({
|
1243 |
+
draw : function(){
|
1244 |
+
|
1245 |
+
var ctx = this.chart.ctx;
|
1246 |
+
|
1247 |
+
ctx.font = fontString(this.fontSize,this.fontStyle,this.fontFamily);
|
1248 |
+
|
1249 |
+
this.xAlign = "center";
|
1250 |
+
this.yAlign = "above";
|
1251 |
+
|
1252 |
+
//Distance between the actual element.y position and the start of the tooltip caret
|
1253 |
+
var caretPadding = 2;
|
1254 |
+
|
1255 |
+
var tooltipWidth = ctx.measureText(this.text).width + 2*this.xPadding,
|
1256 |
+
tooltipRectHeight = this.fontSize + 2*this.yPadding,
|
1257 |
+
tooltipHeight = tooltipRectHeight + this.caretHeight + caretPadding;
|
1258 |
+
|
1259 |
+
if (this.x + tooltipWidth/2 >this.chart.width){
|
1260 |
+
this.xAlign = "left";
|
1261 |
+
} else if (this.x - tooltipWidth/2 < 0){
|
1262 |
+
this.xAlign = "right";
|
1263 |
+
}
|
1264 |
+
|
1265 |
+
if (this.y - tooltipHeight < 0){
|
1266 |
+
this.yAlign = "below";
|
1267 |
+
}
|
1268 |
+
|
1269 |
+
|
1270 |
+
var tooltipX = this.x - tooltipWidth/2,
|
1271 |
+
tooltipY = this.y - tooltipHeight;
|
1272 |
+
|
1273 |
+
ctx.fillStyle = this.fillColor;
|
1274 |
+
|
1275 |
+
switch(this.yAlign)
|
1276 |
+
{
|
1277 |
+
case "above":
|
1278 |
+
//Draw a caret above the x/y
|
1279 |
+
ctx.beginPath();
|
1280 |
+
ctx.moveTo(this.x,this.y - caretPadding);
|
1281 |
+
ctx.lineTo(this.x + this.caretHeight, this.y - (caretPadding + this.caretHeight));
|
1282 |
+
ctx.lineTo(this.x - this.caretHeight, this.y - (caretPadding + this.caretHeight));
|
1283 |
+
ctx.closePath();
|
1284 |
+
ctx.fill();
|
1285 |
+
break;
|
1286 |
+
case "below":
|
1287 |
+
tooltipY = this.y + caretPadding + this.caretHeight;
|
1288 |
+
//Draw a caret below the x/y
|
1289 |
+
ctx.beginPath();
|
1290 |
+
ctx.moveTo(this.x, this.y + caretPadding);
|
1291 |
+
ctx.lineTo(this.x + this.caretHeight, this.y + caretPadding + this.caretHeight);
|
1292 |
+
ctx.lineTo(this.x - this.caretHeight, this.y + caretPadding + this.caretHeight);
|
1293 |
+
ctx.closePath();
|
1294 |
+
ctx.fill();
|
1295 |
+
break;
|
1296 |
+
}
|
1297 |
+
|
1298 |
+
switch(this.xAlign)
|
1299 |
+
{
|
1300 |
+
case "left":
|
1301 |
+
tooltipX = this.x - tooltipWidth + (this.cornerRadius + this.caretHeight);
|
1302 |
+
break;
|
1303 |
+
case "right":
|
1304 |
+
tooltipX = this.x - (this.cornerRadius + this.caretHeight);
|
1305 |
+
break;
|
1306 |
+
}
|
1307 |
+
|
1308 |
+
drawRoundedRectangle(ctx,tooltipX,tooltipY,tooltipWidth,tooltipRectHeight,this.cornerRadius);
|
1309 |
+
|
1310 |
+
ctx.fill();
|
1311 |
+
|
1312 |
+
ctx.fillStyle = this.textColor;
|
1313 |
+
ctx.textAlign = "center";
|
1314 |
+
ctx.textBaseline = "middle";
|
1315 |
+
ctx.fillText(this.text, tooltipX + tooltipWidth/2, tooltipY + tooltipRectHeight/2);
|
1316 |
+
}
|
1317 |
+
});
|
1318 |
+
|
1319 |
+
Chart.MultiTooltip = Chart.Element.extend({
|
1320 |
+
initialize : function(){
|
1321 |
+
this.font = fontString(this.fontSize,this.fontStyle,this.fontFamily);
|
1322 |
+
|
1323 |
+
this.titleFont = fontString(this.titleFontSize,this.titleFontStyle,this.titleFontFamily);
|
1324 |
+
|
1325 |
+
this.height = (this.labels.length * this.fontSize) + ((this.labels.length-1) * (this.fontSize/2)) + (this.yPadding*2) + this.titleFontSize *1.5;
|
1326 |
+
|
1327 |
+
this.ctx.font = this.titleFont;
|
1328 |
+
|
1329 |
+
var titleWidth = this.ctx.measureText(this.title).width,
|
1330 |
+
//Label has a legend square as well so account for this.
|
1331 |
+
labelWidth = longestText(this.ctx,this.font,this.labels) + this.fontSize + 3,
|
1332 |
+
longestTextWidth = max([labelWidth,titleWidth]);
|
1333 |
+
|
1334 |
+
this.width = longestTextWidth + (this.xPadding*2);
|
1335 |
+
|
1336 |
+
|
1337 |
+
var halfHeight = this.height/2;
|
1338 |
+
|
1339 |
+
//Check to ensure the height will fit on the canvas
|
1340 |
+
//The three is to buffer form the very
|
1341 |
+
if (this.y - halfHeight < 0 ){
|
1342 |
+
this.y = halfHeight;
|
1343 |
+
} else if (this.y + halfHeight > this.chart.height){
|
1344 |
+
this.y = this.chart.height - halfHeight;
|
1345 |
+
}
|
1346 |
+
|
1347 |
+
//Decide whether to align left or right based on position on canvas
|
1348 |
+
if (this.x > this.chart.width/2){
|
1349 |
+
this.x -= this.xOffset + this.width;
|
1350 |
+
} else {
|
1351 |
+
this.x += this.xOffset;
|
1352 |
+
}
|
1353 |
+
|
1354 |
+
|
1355 |
+
},
|
1356 |
+
getLineHeight : function(index){
|
1357 |
+
var baseLineHeight = this.y - (this.height/2) + this.yPadding,
|
1358 |
+
afterTitleIndex = index-1;
|
1359 |
+
|
1360 |
+
//If the index is zero, we're getting the title
|
1361 |
+
if (index === 0){
|
1362 |
+
return baseLineHeight + this.titleFontSize/2;
|
1363 |
+
} else{
|
1364 |
+
return baseLineHeight + ((this.fontSize*1.5*afterTitleIndex) + this.fontSize/2) + this.titleFontSize * 1.5;
|
1365 |
+
}
|
1366 |
+
|
1367 |
+
},
|
1368 |
+
draw : function(){
|
1369 |
+
drawRoundedRectangle(this.ctx,this.x,this.y - this.height/2,this.width,this.height,this.cornerRadius);
|
1370 |
+
var ctx = this.ctx;
|
1371 |
+
ctx.fillStyle = this.fillColor;
|
1372 |
+
ctx.fill();
|
1373 |
+
ctx.closePath();
|
1374 |
+
|
1375 |
+
ctx.textAlign = "left";
|
1376 |
+
ctx.textBaseline = "middle";
|
1377 |
+
ctx.fillStyle = this.titleTextColor;
|
1378 |
+
ctx.font = this.titleFont;
|
1379 |
+
|
1380 |
+
ctx.fillText(this.title,this.x + this.xPadding, this.getLineHeight(0));
|
1381 |
+
|
1382 |
+
ctx.font = this.font;
|
1383 |
+
helpers.each(this.labels,function(label,index){
|
1384 |
+
ctx.fillStyle = this.textColor;
|
1385 |
+
ctx.fillText(label,this.x + this.xPadding + this.fontSize + 3, this.getLineHeight(index + 1));
|
1386 |
+
|
1387 |
+
//A bit gnarly, but clearing this rectangle breaks when using explorercanvas (clears whole canvas)
|
1388 |
+
//ctx.clearRect(this.x + this.xPadding, this.getLineHeight(index + 1) - this.fontSize/2, this.fontSize, this.fontSize);
|
1389 |
+
//Instead we'll make a white filled block to put the legendColour palette over.
|
1390 |
+
|
1391 |
+
ctx.fillStyle = this.legendColorBackground;
|
1392 |
+
ctx.fillRect(this.x + this.xPadding, this.getLineHeight(index + 1) - this.fontSize/2, this.fontSize, this.fontSize);
|
1393 |
+
|
1394 |
+
ctx.fillStyle = this.legendColors[index].fill;
|
1395 |
+
ctx.fillRect(this.x + this.xPadding, this.getLineHeight(index + 1) - this.fontSize/2, this.fontSize, this.fontSize);
|
1396 |
+
|
1397 |
+
|
1398 |
+
},this);
|
1399 |
+
}
|
1400 |
+
});
|
1401 |
+
|
1402 |
+
Chart.Scale = Chart.Element.extend({
|
1403 |
+
initialize : function(){
|
1404 |
+
this.fit();
|
1405 |
+
},
|
1406 |
+
buildYLabels : function(){
|
1407 |
+
this.yLabels = [];
|
1408 |
+
|
1409 |
+
var stepDecimalPlaces = getDecimalPlaces(this.stepValue);
|
1410 |
+
|
1411 |
+
for (var i=0; i<=this.steps; i++){
|
1412 |
+
this.yLabels.push(template(this.templateString,{value:(this.min + (i * this.stepValue)).toFixed(stepDecimalPlaces)}));
|
1413 |
+
}
|
1414 |
+
this.yLabelWidth = (this.display && this.showLabels) ? longestText(this.ctx,this.font,this.yLabels) : 0;
|
1415 |
+
},
|
1416 |
+
addXLabel : function(label){
|
1417 |
+
this.xLabels.push(label);
|
1418 |
+
this.valuesCount++;
|
1419 |
+
this.fit();
|
1420 |
+
},
|
1421 |
+
removeXLabel : function(){
|
1422 |
+
this.xLabels.shift();
|
1423 |
+
this.valuesCount--;
|
1424 |
+
this.fit();
|
1425 |
+
},
|
1426 |
+
// Fitting loop to rotate x Labels and figure out what fits there, and also calculate how many Y steps to use
|
1427 |
+
fit: function(){
|
1428 |
+
// First we need the width of the yLabels, assuming the xLabels aren't rotated
|
1429 |
+
|
1430 |
+
// To do that we need the base line at the top and base of the chart, assuming there is no x label rotation
|
1431 |
+
this.startPoint = (this.display) ? this.fontSize : 0;
|
1432 |
+
this.endPoint = (this.display) ? this.height - (this.fontSize * 1.5) - 5 : this.height; // -5 to pad labels
|
1433 |
+
|
1434 |
+
// Apply padding settings to the start and end point.
|
1435 |
+
this.startPoint += this.padding;
|
1436 |
+
this.endPoint -= this.padding;
|
1437 |
+
|
1438 |
+
// Cache the starting height, so can determine if we need to recalculate the scale yAxis
|
1439 |
+
var cachedHeight = this.endPoint - this.startPoint,
|
1440 |
+
cachedYLabelWidth;
|
1441 |
+
|
1442 |
+
// Build the current yLabels so we have an idea of what size they'll be to start
|
1443 |
+
/*
|
1444 |
+
* This sets what is returned from calculateScaleRange as static properties of this class:
|
1445 |
+
*
|
1446 |
+
this.steps;
|
1447 |
+
this.stepValue;
|
1448 |
+
this.min;
|
1449 |
+
this.max;
|
1450 |
+
*
|
1451 |
+
*/
|
1452 |
+
this.calculateYRange(cachedHeight);
|
1453 |
+
|
1454 |
+
// With these properties set we can now build the array of yLabels
|
1455 |
+
// and also the width of the largest yLabel
|
1456 |
+
this.buildYLabels();
|
1457 |
+
|
1458 |
+
this.calculateXLabelRotation();
|
1459 |
+
|
1460 |
+
while((cachedHeight > this.endPoint - this.startPoint)){
|
1461 |
+
cachedHeight = this.endPoint - this.startPoint;
|
1462 |
+
cachedYLabelWidth = this.yLabelWidth;
|
1463 |
+
|
1464 |
+
this.calculateYRange(cachedHeight);
|
1465 |
+
this.buildYLabels();
|
1466 |
+
|
1467 |
+
// Only go through the xLabel loop again if the yLabel width has changed
|
1468 |
+
if (cachedYLabelWidth < this.yLabelWidth){
|
1469 |
+
this.calculateXLabelRotation();
|
1470 |
+
}
|
1471 |
+
}
|
1472 |
+
|
1473 |
+
},
|
1474 |
+
calculateXLabelRotation : function(){
|
1475 |
+
//Get the width of each grid by calculating the difference
|
1476 |
+
//between x offsets between 0 and 1.
|
1477 |
+
|
1478 |
+
this.ctx.font = this.font;
|
1479 |
+
|
1480 |
+
var firstWidth = this.ctx.measureText(this.xLabels[0]).width,
|
1481 |
+
lastWidth = this.ctx.measureText(this.xLabels[this.xLabels.length - 1]).width,
|
1482 |
+
firstRotated,
|
1483 |
+
lastRotated;
|
1484 |
+
|
1485 |
+
|
1486 |
+
this.xScalePaddingRight = lastWidth/2 + 3;
|
1487 |
+
this.xScalePaddingLeft = (firstWidth/2 > this.yLabelWidth + 10) ? firstWidth/2 : this.yLabelWidth + 10;
|
1488 |
+
|
1489 |
+
this.xLabelRotation = 0;
|
1490 |
+
if (this.display){
|
1491 |
+
var originalLabelWidth = longestText(this.ctx,this.font,this.xLabels),
|
1492 |
+
cosRotation,
|
1493 |
+
firstRotatedWidth;
|
1494 |
+
this.xLabelWidth = originalLabelWidth;
|
1495 |
+
//Allow 3 pixels x2 padding either side for label readability
|
1496 |
+
var xGridWidth = Math.floor(this.calculateX(1) - this.calculateX(0)) - 6;
|
1497 |
+
|
1498 |
+
//Max label rotate should be 90 - also act as a loop counter
|
1499 |
+
while ((this.xLabelWidth > xGridWidth && this.xLabelRotation === 0) || (this.xLabelWidth > xGridWidth && this.xLabelRotation <= 90 && this.xLabelRotation > 0)){
|
1500 |
+
cosRotation = Math.cos(toRadians(this.xLabelRotation));
|
1501 |
+
|
1502 |
+
firstRotated = cosRotation * firstWidth;
|
1503 |
+
lastRotated = cosRotation * lastWidth;
|
1504 |
+
|
1505 |
+
// We're right aligning the text now.
|
1506 |
+
if (firstRotated + this.fontSize / 2 > this.yLabelWidth + 8){
|
1507 |
+
this.xScalePaddingLeft = firstRotated + this.fontSize / 2;
|
1508 |
+
}
|
1509 |
+
this.xScalePaddingRight = this.fontSize/2;
|
1510 |
+
|
1511 |
+
|
1512 |
+
this.xLabelRotation++;
|
1513 |
+
this.xLabelWidth = cosRotation * originalLabelWidth;
|
1514 |
+
|
1515 |
+
}
|
1516 |
+
if (this.xLabelRotation > 0){
|
1517 |
+
this.endPoint -= Math.sin(toRadians(this.xLabelRotation))*originalLabelWidth + 3;
|
1518 |
+
}
|
1519 |
+
}
|
1520 |
+
else{
|
1521 |
+
this.xLabelWidth = 0;
|
1522 |
+
this.xScalePaddingRight = this.padding;
|
1523 |
+
this.xScalePaddingLeft = this.padding;
|
1524 |
+
}
|
1525 |
+
|
1526 |
+
},
|
1527 |
+
// Needs to be overidden in each Chart type
|
1528 |
+
// Otherwise we need to pass all the data into the scale class
|
1529 |
+
calculateYRange: noop,
|
1530 |
+
drawingArea: function(){
|
1531 |
+
return this.startPoint - this.endPoint;
|
1532 |
+
},
|
1533 |
+
calculateY : function(value){
|
1534 |
+
var scalingFactor = this.drawingArea() / (this.min - this.max);
|
1535 |
+
return this.endPoint - (scalingFactor * (value - this.min));
|
1536 |
+
},
|
1537 |
+
calculateX : function(index){
|
1538 |
+
var isRotated = (this.xLabelRotation > 0),
|
1539 |
+
// innerWidth = (this.offsetGridLines) ? this.width - offsetLeft - this.padding : this.width - (offsetLeft + halfLabelWidth * 2) - this.padding,
|
1540 |
+
innerWidth = this.width - (this.xScalePaddingLeft + this.xScalePaddingRight),
|
1541 |
+
valueWidth = innerWidth/(this.valuesCount - ((this.offsetGridLines) ? 0 : 1)),
|
1542 |
+
valueOffset = (valueWidth * index) + this.xScalePaddingLeft;
|
1543 |
+
|
1544 |
+
if (this.offsetGridLines){
|
1545 |
+
valueOffset += (valueWidth/2);
|
1546 |
+
}
|
1547 |
+
|
1548 |
+
return Math.round(valueOffset);
|
1549 |
+
},
|
1550 |
+
update : function(newProps){
|
1551 |
+
helpers.extend(this, newProps);
|
1552 |
+
this.fit();
|
1553 |
+
},
|
1554 |
+
draw : function(){
|
1555 |
+
var ctx = this.ctx,
|
1556 |
+
yLabelGap = (this.endPoint - this.startPoint) / this.steps,
|
1557 |
+
xStart = Math.round(this.xScalePaddingLeft);
|
1558 |
+
if (this.display){
|
1559 |
+
ctx.fillStyle = this.textColor;
|
1560 |
+
ctx.font = this.font;
|
1561 |
+
each(this.yLabels,function(labelString,index){
|
1562 |
+
var yLabelCenter = this.endPoint - (yLabelGap * index),
|
1563 |
+
linePositionY = Math.round(yLabelCenter);
|
1564 |
+
|
1565 |
+
ctx.textAlign = "right";
|
1566 |
+
ctx.textBaseline = "middle";
|
1567 |
+
if (this.showLabels){
|
1568 |
+
ctx.fillText(labelString,xStart - 10,yLabelCenter);
|
1569 |
+
}
|
1570 |
+
ctx.beginPath();
|
1571 |
+
if (index > 0){
|
1572 |
+
// This is a grid line in the centre, so drop that
|
1573 |
+
ctx.lineWidth = this.gridLineWidth;
|
1574 |
+
ctx.strokeStyle = this.gridLineColor;
|
1575 |
+
} else {
|
1576 |
+
// This is the first line on the scale
|
1577 |
+
ctx.lineWidth = this.lineWidth;
|
1578 |
+
ctx.strokeStyle = this.lineColor;
|
1579 |
+
}
|
1580 |
+
|
1581 |
+
linePositionY += helpers.aliasPixel(ctx.lineWidth);
|
1582 |
+
|
1583 |
+
ctx.moveTo(xStart, linePositionY);
|
1584 |
+
ctx.lineTo(this.width, linePositionY);
|
1585 |
+
ctx.stroke();
|
1586 |
+
ctx.closePath();
|
1587 |
+
|
1588 |
+
ctx.lineWidth = this.lineWidth;
|
1589 |
+
ctx.strokeStyle = this.lineColor;
|
1590 |
+
ctx.beginPath();
|
1591 |
+
ctx.moveTo(xStart - 5, linePositionY);
|
1592 |
+
ctx.lineTo(xStart, linePositionY);
|
1593 |
+
ctx.stroke();
|
1594 |
+
ctx.closePath();
|
1595 |
+
|
1596 |
+
},this);
|
1597 |
+
|
1598 |
+
each(this.xLabels,function(label,index){
|
1599 |
+
var xPos = this.calculateX(index) + aliasPixel(this.lineWidth),
|
1600 |
+
// Check to see if line/bar here and decide where to place the line
|
1601 |
+
linePos = this.calculateX(index - (this.offsetGridLines ? 0.5 : 0)) + aliasPixel(this.lineWidth),
|
1602 |
+
isRotated = (this.xLabelRotation > 0);
|
1603 |
+
|
1604 |
+
ctx.beginPath();
|
1605 |
+
|
1606 |
+
if (index > 0){
|
1607 |
+
// This is a grid line in the centre, so drop that
|
1608 |
+
ctx.lineWidth = this.gridLineWidth;
|
1609 |
+
ctx.strokeStyle = this.gridLineColor;
|
1610 |
+
} else {
|
1611 |
+
// This is the first line on the scale
|
1612 |
+
ctx.lineWidth = this.lineWidth;
|
1613 |
+
ctx.strokeStyle = this.lineColor;
|
1614 |
+
}
|
1615 |
+
ctx.moveTo(linePos,this.endPoint);
|
1616 |
+
ctx.lineTo(linePos,this.startPoint - 3);
|
1617 |
+
ctx.stroke();
|
1618 |
+
ctx.closePath();
|
1619 |
+
|
1620 |
+
|
1621 |
+
ctx.lineWidth = this.lineWidth;
|
1622 |
+
ctx.strokeStyle = this.lineColor;
|
1623 |
+
|
1624 |
+
|
1625 |
+
// Small lines at the bottom of the base grid line
|
1626 |
+
ctx.beginPath();
|
1627 |
+
ctx.moveTo(linePos,this.endPoint);
|
1628 |
+
ctx.lineTo(linePos,this.endPoint + 5);
|
1629 |
+
ctx.stroke();
|
1630 |
+
ctx.closePath();
|
1631 |
+
|
1632 |
+
ctx.save();
|
1633 |
+
ctx.translate(xPos,(isRotated) ? this.endPoint + 12 : this.endPoint + 8);
|
1634 |
+
ctx.rotate(toRadians(this.xLabelRotation)*-1);
|
1635 |
+
ctx.font = this.font;
|
1636 |
+
ctx.textAlign = (isRotated) ? "right" : "center";
|
1637 |
+
ctx.textBaseline = (isRotated) ? "middle" : "top";
|
1638 |
+
ctx.fillText(label, 0, 0);
|
1639 |
+
ctx.restore();
|
1640 |
+
},this);
|
1641 |
+
|
1642 |
+
}
|
1643 |
+
}
|
1644 |
+
|
1645 |
+
});
|
1646 |
+
|
1647 |
+
Chart.RadialScale = Chart.Element.extend({
|
1648 |
+
initialize: function(){
|
1649 |
+
this.size = min([this.height, this.width]);
|
1650 |
+
this.drawingArea = (this.display) ? (this.size/2) - (this.fontSize/2 + this.backdropPaddingY) : (this.size/2);
|
1651 |
+
},
|
1652 |
+
calculateCenterOffset: function(value){
|
1653 |
+
// Take into account half font size + the yPadding of the top value
|
1654 |
+
var scalingFactor = this.drawingArea / (this.max - this.min);
|
1655 |
+
|
1656 |
+
return (value - this.min) * scalingFactor;
|
1657 |
+
},
|
1658 |
+
update : function(){
|
1659 |
+
if (!this.lineArc){
|
1660 |
+
this.setScaleSize();
|
1661 |
+
} else {
|
1662 |
+
this.drawingArea = (this.display) ? (this.size/2) - (this.fontSize/2 + this.backdropPaddingY) : (this.size/2);
|
1663 |
+
}
|
1664 |
+
this.buildYLabels();
|
1665 |
+
},
|
1666 |
+
buildYLabels: function(){
|
1667 |
+
this.yLabels = [];
|
1668 |
+
|
1669 |
+
var stepDecimalPlaces = getDecimalPlaces(this.stepValue);
|
1670 |
+
|
1671 |
+
for (var i=0; i<=this.steps; i++){
|
1672 |
+
this.yLabels.push(template(this.templateString,{value:(this.min + (i * this.stepValue)).toFixed(stepDecimalPlaces)}));
|
1673 |
+
}
|
1674 |
+
},
|
1675 |
+
getCircumference : function(){
|
1676 |
+
return ((Math.PI*2) / this.valuesCount);
|
1677 |
+
},
|
1678 |
+
setScaleSize: function(){
|
1679 |
+
/*
|
1680 |
+
* Right, this is really confusing and there is a lot of maths going on here
|
1681 |
+
* The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9
|
1682 |
+
*
|
1683 |
+
* Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif
|
1684 |
+
*
|
1685 |
+
* Solution:
|
1686 |
+
*
|
1687 |
+
* We assume the radius of the polygon is half the size of the canvas at first
|
1688 |
+
* at each index we check if the text overlaps.
|
1689 |
+
*
|
1690 |
+
* Where it does, we store that angle and that index.
|
1691 |
+
*
|
1692 |
+
* After finding the largest index and angle we calculate how much we need to remove
|
1693 |
+
* from the shape radius to move the point inwards by that x.
|
1694 |
+
*
|
1695 |
+
* We average the left and right distances to get the maximum shape radius that can fit in the box
|
1696 |
+
* along with labels.
|
1697 |
+
*
|
1698 |
+
* Once we have that, we can find the centre point for the chart, by taking the x text protrusion
|
1699 |
+
* on each side, removing that from the size, halving it and adding the left x protrusion width.
|
1700 |
+
*
|
1701 |
+
* This will mean we have a shape fitted to the canvas, as large as it can be with the labels
|
1702 |
+
* and position it in the most space efficient manner
|
1703 |
+
*
|
1704 |
+
* https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif
|
1705 |
+
*/
|
1706 |
+
|
1707 |
+
|
1708 |
+
// Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.
|
1709 |
+
// Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points
|
1710 |
+
var largestPossibleRadius = min([(this.height/2 - this.pointLabelFontSize - 5), this.width/2]),
|
1711 |
+
pointPosition,
|
1712 |
+
i,
|
1713 |
+
textWidth,
|
1714 |
+
halfTextWidth,
|
1715 |
+
furthestRight = this.width,
|
1716 |
+
furthestRightIndex,
|
1717 |
+
furthestRightAngle,
|
1718 |
+
furthestLeft = 0,
|
1719 |
+
furthestLeftIndex,
|
1720 |
+
furthestLeftAngle,
|
1721 |
+
xProtrusionLeft,
|
1722 |
+
xProtrusionRight,
|
1723 |
+
radiusReductionRight,
|
1724 |
+
radiusReductionLeft,
|
1725 |
+
maxWidthRadius;
|
1726 |
+
this.ctx.font = fontString(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily);
|
1727 |
+
for (i=0;i<this.valuesCount;i++){
|
1728 |
+
// 5px to space the text slightly out - similar to what we do in the draw function.
|
1729 |
+
pointPosition = this.getPointPosition(i, largestPossibleRadius);
|
1730 |
+
textWidth = this.ctx.measureText(template(this.templateString, { value: this.labels[i] })).width + 5;
|
1731 |
+
if (i === 0 || i === this.valuesCount/2){
|
1732 |
+
// If we're at index zero, or exactly the middle, we're at exactly the top/bottom
|
1733 |
+
// of the radar chart, so text will be aligned centrally, so we'll half it and compare
|
1734 |
+
// w/left and right text sizes
|
1735 |
+
halfTextWidth = textWidth/2;
|
1736 |
+
if (pointPosition.x + halfTextWidth > furthestRight) {
|
1737 |
+
furthestRight = pointPosition.x + halfTextWidth;
|
1738 |
+
furthestRightIndex = i;
|
1739 |
+
}
|
1740 |
+
if (pointPosition.x - halfTextWidth < furthestLeft) {
|
1741 |
+
furthestLeft = pointPosition.x - halfTextWidth;
|
1742 |
+
furthestLeftIndex = i;
|
1743 |
+
}
|
1744 |
+
}
|
1745 |
+
else if (i < this.valuesCount/2) {
|
1746 |
+
// Less than half the values means we'll left align the text
|
1747 |
+
if (pointPosition.x + textWidth > furthestRight) {
|
1748 |
+
furthestRight = pointPosition.x + textWidth;
|
1749 |
+
furthestRightIndex = i;
|
1750 |
+
}
|
1751 |
+
}
|
1752 |
+
else if (i > this.valuesCount/2){
|
1753 |
+
// More than half the values means we'll right align the text
|
1754 |
+
if (pointPosition.x - textWidth < furthestLeft) {
|
1755 |
+
furthestLeft = pointPosition.x - textWidth;
|
1756 |
+
furthestLeftIndex = i;
|
1757 |
+
}
|
1758 |
+
}
|
1759 |
+
}
|
1760 |
+
|
1761 |
+
xProtrusionLeft = furthestLeft;
|
1762 |
+
|
1763 |
+
xProtrusionRight = Math.ceil(furthestRight - this.width);
|
1764 |
+
|
1765 |
+
furthestRightAngle = this.getIndexAngle(furthestRightIndex);
|
1766 |
+
|
1767 |
+
furthestLeftAngle = this.getIndexAngle(furthestLeftIndex);
|
1768 |
+
|
1769 |
+
radiusReductionRight = xProtrusionRight / Math.sin(furthestRightAngle + Math.PI/2);
|
1770 |
+
|
1771 |
+
radiusReductionLeft = xProtrusionLeft / Math.sin(furthestLeftAngle + Math.PI/2);
|
1772 |
+
|
1773 |
+
// Ensure we actually need to reduce the size of the chart
|
1774 |
+
radiusReductionRight = (isNumber(radiusReductionRight)) ? radiusReductionRight : 0;
|
1775 |
+
radiusReductionLeft = (isNumber(radiusReductionLeft)) ? radiusReductionLeft : 0;
|
1776 |
+
|
1777 |
+
this.drawingArea = largestPossibleRadius - (radiusReductionLeft + radiusReductionRight)/2;
|
1778 |
+
|
1779 |
+
//this.drawingArea = min([maxWidthRadius, (this.height - (2 * (this.pointLabelFontSize + 5)))/2])
|
1780 |
+
this.setCenterPoint(radiusReductionLeft, radiusReductionRight);
|
1781 |
+
|
1782 |
+
},
|
1783 |
+
setCenterPoint: function(leftMovement, rightMovement){
|
1784 |
+
|
1785 |
+
var maxRight = this.width - rightMovement - this.drawingArea,
|
1786 |
+
maxLeft = leftMovement + this.drawingArea;
|
1787 |
+
|
1788 |
+
this.xCenter = (maxLeft + maxRight)/2;
|
1789 |
+
// Always vertically in the centre as the text height doesn't change
|
1790 |
+
this.yCenter = (this.height/2);
|
1791 |
+
},
|
1792 |
+
|
1793 |
+
getIndexAngle : function(index){
|
1794 |
+
var angleMultiplier = (Math.PI * 2) / this.valuesCount;
|
1795 |
+
// Start from the top instead of right, so remove a quarter of the circle
|
1796 |
+
|
1797 |
+
return index * angleMultiplier - (Math.PI/2);
|
1798 |
+
},
|
1799 |
+
getPointPosition : function(index, distanceFromCenter){
|
1800 |
+
var thisAngle = this.getIndexAngle(index);
|
1801 |
+
return {
|
1802 |
+
x : (Math.cos(thisAngle) * distanceFromCenter) + this.xCenter,
|
1803 |
+
y : (Math.sin(thisAngle) * distanceFromCenter) + this.yCenter
|
1804 |
+
};
|
1805 |
+
},
|
1806 |
+
draw: function(){
|
1807 |
+
if (this.display){
|
1808 |
+
var ctx = this.ctx;
|
1809 |
+
each(this.yLabels, function(label, index){
|
1810 |
+
// Don't draw a centre value
|
1811 |
+
if (index > 0){
|
1812 |
+
var yCenterOffset = index * (this.drawingArea/this.steps),
|
1813 |
+
yHeight = this.yCenter - yCenterOffset,
|
1814 |
+
pointPosition;
|
1815 |
+
|
1816 |
+
// Draw circular lines around the scale
|
1817 |
+
if (this.lineWidth > 0){
|
1818 |
+
ctx.strokeStyle = this.lineColor;
|
1819 |
+
ctx.lineWidth = this.lineWidth;
|
1820 |
+
|
1821 |
+
if(this.lineArc){
|
1822 |
+
ctx.beginPath();
|
1823 |
+
ctx.arc(this.xCenter, this.yCenter, yCenterOffset, 0, Math.PI*2);
|
1824 |
+
ctx.closePath();
|
1825 |
+
ctx.stroke();
|
1826 |
+
} else{
|
1827 |
+
ctx.beginPath();
|
1828 |
+
for (var i=0;i<this.valuesCount;i++)
|
1829 |
+
{
|
1830 |
+
pointPosition = this.getPointPosition(i, this.calculateCenterOffset(this.min + (index * this.stepValue)));
|
1831 |
+
if (i === 0){
|
1832 |
+
ctx.moveTo(pointPosition.x, pointPosition.y);
|
1833 |
+
} else {
|
1834 |
+
ctx.lineTo(pointPosition.x, pointPosition.y);
|
1835 |
+
}
|
1836 |
+
}
|
1837 |
+
ctx.closePath();
|
1838 |
+
ctx.stroke();
|
1839 |
+
}
|
1840 |
+
}
|
1841 |
+
if(this.showLabels){
|
1842 |
+
ctx.font = fontString(this.fontSize,this.fontStyle,this.fontFamily);
|
1843 |
+
if (this.showLabelBackdrop){
|
1844 |
+
var labelWidth = ctx.measureText(label).width;
|
1845 |
+
ctx.fillStyle = this.backdropColor;
|
1846 |
+
ctx.fillRect(
|
1847 |
+
this.xCenter - labelWidth/2 - this.backdropPaddingX,
|
1848 |
+
yHeight - this.fontSize/2 - this.backdropPaddingY,
|
1849 |
+
labelWidth + this.backdropPaddingX*2,
|
1850 |
+
this.fontSize + this.backdropPaddingY*2
|
1851 |
+
);
|
1852 |
+
}
|
1853 |
+
ctx.textAlign = 'center';
|
1854 |
+
ctx.textBaseline = "middle";
|
1855 |
+
ctx.fillStyle = this.fontColor;
|
1856 |
+
ctx.fillText(label, this.xCenter, yHeight);
|
1857 |
+
}
|
1858 |
+
}
|
1859 |
+
}, this);
|
1860 |
+
|
1861 |
+
if (!this.lineArc){
|
1862 |
+
ctx.lineWidth = this.angleLineWidth;
|
1863 |
+
ctx.strokeStyle = this.angleLineColor;
|
1864 |
+
for (var i = this.valuesCount - 1; i >= 0; i--) {
|
1865 |
+
if (this.angleLineWidth > 0){
|
1866 |
+
var outerPosition = this.getPointPosition(i, this.calculateCenterOffset(this.max));
|
1867 |
+
ctx.beginPath();
|
1868 |
+
ctx.moveTo(this.xCenter, this.yCenter);
|
1869 |
+
ctx.lineTo(outerPosition.x, outerPosition.y);
|
1870 |
+
ctx.stroke();
|
1871 |
+
ctx.closePath();
|
1872 |
+
}
|
1873 |
+
// Extra 3px out for some label spacing
|
1874 |
+
var pointLabelPosition = this.getPointPosition(i, this.calculateCenterOffset(this.max) + 5);
|
1875 |
+
ctx.font = fontString(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily);
|
1876 |
+
ctx.fillStyle = this.pointLabelFontColor;
|
1877 |
+
|
1878 |
+
var labelsCount = this.labels.length,
|
1879 |
+
halfLabelsCount = this.labels.length/2,
|
1880 |
+
quarterLabelsCount = halfLabelsCount/2,
|
1881 |
+
upperHalf = (i < quarterLabelsCount || i > labelsCount - quarterLabelsCount),
|
1882 |
+
exactQuarter = (i === quarterLabelsCount || i === labelsCount - quarterLabelsCount);
|
1883 |
+
if (i === 0){
|
1884 |
+
ctx.textAlign = 'center';
|
1885 |
+
} else if(i === halfLabelsCount){
|
1886 |
+
ctx.textAlign = 'center';
|
1887 |
+
} else if (i < halfLabelsCount){
|
1888 |
+
ctx.textAlign = 'left';
|
1889 |
+
} else {
|
1890 |
+
ctx.textAlign = 'right';
|
1891 |
+
}
|
1892 |
+
|
1893 |
+
// Set the correct text baseline based on outer positioning
|
1894 |
+
if (exactQuarter){
|
1895 |
+
ctx.textBaseline = 'middle';
|
1896 |
+
} else if (upperHalf){
|
1897 |
+
ctx.textBaseline = 'bottom';
|
1898 |
+
} else {
|
1899 |
+
ctx.textBaseline = 'top';
|
1900 |
+
}
|
1901 |
+
|
1902 |
+
ctx.fillText(this.labels[i], pointLabelPosition.x, pointLabelPosition.y);
|
1903 |
+
}
|
1904 |
+
}
|
1905 |
+
}
|
1906 |
+
}
|
1907 |
+
});
|
1908 |
+
|
1909 |
+
// Attach global event to resize each chart instance when the browser resizes
|
1910 |
+
helpers.addEvent(window, "resize", (function(){
|
1911 |
+
// Basic debounce of resize function so it doesn't hurt performance when resizing browser.
|
1912 |
+
var timeout;
|
1913 |
+
return function(){
|
1914 |
+
clearTimeout(timeout);
|
1915 |
+
timeout = setTimeout(function(){
|
1916 |
+
each(Chart.instances,function(instance){
|
1917 |
+
// If the responsive flag is set in the chart instance config
|
1918 |
+
// Cascade the resize event down to the chart.
|
1919 |
+
if (instance.options.responsive){
|
1920 |
+
instance.resize(instance.render, true);
|
1921 |
+
}
|
1922 |
+
});
|
1923 |
+
}, 50);
|
1924 |
+
};
|
1925 |
+
})());
|
1926 |
+
|
1927 |
+
|
1928 |
+
if (amd) {
|
1929 |
+
define(function(){
|
1930 |
+
return Chart;
|
1931 |
+
});
|
1932 |
+
} else if (typeof module === 'object' && module.exports) {
|
1933 |
+
module.exports = Chart;
|
1934 |
+
}
|
1935 |
+
|
1936 |
+
root.Chart = Chart;
|
1937 |
+
|
1938 |
+
Chart.noConflict = function(){
|
1939 |
+
root.Chart = previous;
|
1940 |
+
return Chart;
|
1941 |
+
};
|
1942 |
+
|
1943 |
+
}).call(this);
|
1944 |
+
|
1945 |
+
(function(){
|
1946 |
+
"use strict";
|
1947 |
+
|
1948 |
+
var root = this,
|
1949 |
+
Chart = root.Chart,
|
1950 |
+
helpers = Chart.helpers;
|
1951 |
+
|
1952 |
+
|
1953 |
+
var defaultConfig = {
|
1954 |
+
//Boolean - Whether the scale should start at zero, or an order of magnitude down from the lowest value
|
1955 |
+
scaleBeginAtZero : true,
|
1956 |
+
|
1957 |
+
//Boolean - Whether grid lines are shown across the chart
|
1958 |
+
scaleShowGridLines : true,
|
1959 |
+
|
1960 |
+
//String - Colour of the grid lines
|
1961 |
+
scaleGridLineColor : "rgba(0,0,0,.05)",
|
1962 |
+
|
1963 |
+
//Number - Width of the grid lines
|
1964 |
+
scaleGridLineWidth : 1,
|
1965 |
+
|
1966 |
+
//Boolean - If there is a stroke on each bar
|
1967 |
+
barShowStroke : true,
|
1968 |
+
|
1969 |
+
//Number - Pixel width of the bar stroke
|
1970 |
+
barStrokeWidth : 2,
|
1971 |
+
|
1972 |
+
//Number - Spacing between each of the X value sets
|
1973 |
+
barValueSpacing : 5,
|
1974 |
+
|
1975 |
+
//Number - Spacing between data sets within X values
|
1976 |
+
barDatasetSpacing : 1,
|
1977 |
+
|
1978 |
+
//String - A legend template
|
1979 |
+
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].fillColor%>\"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>"
|
1980 |
+
|
1981 |
+
};
|
1982 |
+
|
1983 |
+
|
1984 |
+
Chart.Type.extend({
|
1985 |
+
name: "Bar",
|
1986 |
+
defaults : defaultConfig,
|
1987 |
+
initialize: function(data){
|
1988 |
+
|
1989 |
+
//Expose options as a scope variable here so we can access it in the ScaleClass
|
1990 |
+
var options = this.options;
|
1991 |
+
|
1992 |
+
this.ScaleClass = Chart.Scale.extend({
|
1993 |
+
offsetGridLines : true,
|
1994 |
+
calculateBarX : function(datasetCount, datasetIndex, barIndex){
|
1995 |
+
//Reusable method for calculating the xPosition of a given bar based on datasetIndex & width of the bar
|
1996 |
+
var xWidth = this.calculateBaseWidth(),
|
1997 |
+
xAbsolute = this.calculateX(barIndex) - (xWidth/2),
|
1998 |
+
barWidth = this.calculateBarWidth(datasetCount);
|
1999 |
+
|
2000 |
+
return xAbsolute + (barWidth * datasetIndex) + (datasetIndex * options.barDatasetSpacing) + barWidth/2;
|
2001 |
+
},
|
2002 |
+
calculateBaseWidth : function(){
|
2003 |
+
return (this.calculateX(1) - this.calculateX(0)) - (2*options.barValueSpacing);
|
2004 |
+
},
|
2005 |
+
calculateBarWidth : function(datasetCount){
|
2006 |
+
//The padding between datasets is to the right of each bar, providing that there are more than 1 dataset
|
2007 |
+
var baseWidth = this.calculateBaseWidth() - ((datasetCount - 1) * options.barDatasetSpacing);
|
2008 |
+
|
2009 |
+
return (baseWidth / datasetCount);
|
2010 |
+
}
|
2011 |
+
});
|
2012 |
+
|
2013 |
+
this.datasets = [];
|
2014 |
+
|
2015 |
+
//Set up tooltip events on the chart
|
2016 |
+
if (this.options.showTooltips){
|
2017 |
+
helpers.bindEvents(this, this.options.tooltipEvents, function(evt){
|
2018 |
+
var activeBars = (evt.type !== 'mouseout') ? this.getBarsAtEvent(evt) : [];
|
2019 |
+
|
2020 |
+
this.eachBars(function(bar){
|
2021 |
+
bar.restore(['fillColor', 'strokeColor']);
|
2022 |
+
});
|
2023 |
+
helpers.each(activeBars, function(activeBar){
|
2024 |
+
activeBar.fillColor = activeBar.highlightFill;
|
2025 |
+
activeBar.strokeColor = activeBar.highlightStroke;
|
2026 |
+
});
|
2027 |
+
this.showTooltip(activeBars);
|
2028 |
+
});
|
2029 |
+
}
|
2030 |
+
|
2031 |
+
//Declare the extension of the default point, to cater for the options passed in to the constructor
|
2032 |
+
this.BarClass = Chart.Rectangle.extend({
|
2033 |
+
strokeWidth : this.options.barStrokeWidth,
|
2034 |
+
showStroke : this.options.barShowStroke,
|
2035 |
+
ctx : this.chart.ctx
|
2036 |
+
});
|
2037 |
+
|
2038 |
+
//Iterate through each of the datasets, and build this into a property of the chart
|
2039 |
+
helpers.each(data.datasets,function(dataset,datasetIndex){
|
2040 |
+
|
2041 |
+
var datasetObject = {
|
2042 |
+
label : dataset.label || null,
|
2043 |
+
fillColor : dataset.fillColor,
|
2044 |
+
strokeColor : dataset.strokeColor,
|
2045 |
+
bars : []
|
2046 |
+
};
|
2047 |
+
|
2048 |
+
this.datasets.push(datasetObject);
|
2049 |
+
|
2050 |
+
helpers.each(dataset.data,function(dataPoint,index){
|
2051 |
+
//Add a new point for each piece of data, passing any required data to draw.
|
2052 |
+
datasetObject.bars.push(new this.BarClass({
|
2053 |
+
value : dataPoint,
|
2054 |
+
label : data.labels[index],
|
2055 |
+
datasetLabel: dataset.label,
|
2056 |
+
strokeColor : dataset.strokeColor,
|
2057 |
+
fillColor : dataset.fillColor,
|
2058 |
+
highlightFill : dataset.highlightFill || dataset.fillColor,
|
2059 |
+
highlightStroke : dataset.highlightStroke || dataset.strokeColor
|
2060 |
+
}));
|
2061 |
+
},this);
|
2062 |
+
|
2063 |
+
},this);
|
2064 |
+
|
2065 |
+
this.buildScale(data.labels);
|
2066 |
+
|
2067 |
+
this.BarClass.prototype.base = this.scale.endPoint;
|
2068 |
+
|
2069 |
+
this.eachBars(function(bar, index, datasetIndex){
|
2070 |
+
helpers.extend(bar, {
|
2071 |
+
width : this.scale.calculateBarWidth(this.datasets.length),
|
2072 |
+
x: this.scale.calculateBarX(this.datasets.length, datasetIndex, index),
|
2073 |
+
y: this.scale.endPoint
|
2074 |
+
});
|
2075 |
+
bar.save();
|
2076 |
+
}, this);
|
2077 |
+
|
2078 |
+
this.render();
|
2079 |
+
},
|
2080 |
+
update : function(){
|
2081 |
+
this.scale.update();
|
2082 |
+
// Reset any highlight colours before updating.
|
2083 |
+
helpers.each(this.activeElements, function(activeElement){
|
2084 |
+
activeElement.restore(['fillColor', 'strokeColor']);
|
2085 |
+
});
|
2086 |
+
|
2087 |
+
this.eachBars(function(bar){
|
2088 |
+
bar.save();
|
2089 |
+
});
|
2090 |
+
this.render();
|
2091 |
+
},
|
2092 |
+
eachBars : function(callback){
|
2093 |
+
helpers.each(this.datasets,function(dataset, datasetIndex){
|
2094 |
+
helpers.each(dataset.bars, callback, this, datasetIndex);
|
2095 |
+
},this);
|
2096 |
+
},
|
2097 |
+
getBarsAtEvent : function(e){
|
2098 |
+
var barsArray = [],
|
2099 |
+
eventPosition = helpers.getRelativePosition(e),
|
2100 |
+
datasetIterator = function(dataset){
|
2101 |
+
barsArray.push(dataset.bars[barIndex]);
|
2102 |
+
},
|
2103 |
+
barIndex;
|
2104 |
+
|
2105 |
+
for (var datasetIndex = 0; datasetIndex < this.datasets.length; datasetIndex++) {
|
2106 |
+
for (barIndex = 0; barIndex < this.datasets[datasetIndex].bars.length; barIndex++) {
|
2107 |
+
if (this.datasets[datasetIndex].bars[barIndex].inRange(eventPosition.x,eventPosition.y)){
|
2108 |
+
helpers.each(this.datasets, datasetIterator);
|
2109 |
+
return barsArray;
|
2110 |
+
}
|
2111 |
+
}
|
2112 |
+
}
|
2113 |
+
|
2114 |
+
return barsArray;
|
2115 |
+
},
|
2116 |
+
buildScale : function(labels){
|
2117 |
+
var self = this;
|
2118 |
+
|
2119 |
+
var dataTotal = function(){
|
2120 |
+
var values = [];
|
2121 |
+
self.eachBars(function(bar){
|
2122 |
+
values.push(bar.value);
|
2123 |
+
});
|
2124 |
+
return values;
|
2125 |
+
};
|
2126 |
+
|
2127 |
+
var scaleOptions = {
|
2128 |
+
templateString : this.options.scaleLabel,
|
2129 |
+
height : this.chart.height,
|
2130 |
+
width : this.chart.width,
|
2131 |
+
ctx : this.chart.ctx,
|
2132 |
+
textColor : this.options.scaleFontColor,
|
2133 |
+
fontSize : this.options.scaleFontSize,
|
2134 |
+
fontStyle : this.options.scaleFontStyle,
|
2135 |
+
fontFamily : this.options.scaleFontFamily,
|
2136 |
+
valuesCount : labels.length,
|
2137 |
+
beginAtZero : this.options.scaleBeginAtZero,
|
2138 |
+
integersOnly : this.options.scaleIntegersOnly,
|
2139 |
+
calculateYRange: function(currentHeight){
|
2140 |
+
var updatedRanges = helpers.calculateScaleRange(
|
2141 |
+
dataTotal(),
|
2142 |
+
currentHeight,
|
2143 |
+
this.fontSize,
|
2144 |
+
this.beginAtZero,
|
2145 |
+
this.integersOnly
|
2146 |
+
);
|
2147 |
+
helpers.extend(this, updatedRanges);
|
2148 |
+
},
|
2149 |
+
xLabels : labels,
|
2150 |
+
font : helpers.fontString(this.options.scaleFontSize, this.options.scaleFontStyle, this.options.scaleFontFamily),
|
2151 |
+
lineWidth : this.options.scaleLineWidth,
|
2152 |
+
lineColor : this.options.scaleLineColor,
|
2153 |
+
gridLineWidth : (this.options.scaleShowGridLines) ? this.options.scaleGridLineWidth : 0,
|
2154 |
+
gridLineColor : (this.options.scaleShowGridLines) ? this.options.scaleGridLineColor : "rgba(0,0,0,0)",
|
2155 |
+
padding : (this.options.showScale) ? 0 : (this.options.barShowStroke) ? this.options.barStrokeWidth : 0,
|
2156 |
+
showLabels : this.options.scaleShowLabels,
|
2157 |
+
display : this.options.showScale
|
2158 |
+
};
|
2159 |
+
|
2160 |
+
if (this.options.scaleOverride){
|
2161 |
+
helpers.extend(scaleOptions, {
|
2162 |
+
calculateYRange: helpers.noop,
|
2163 |
+
steps: this.options.scaleSteps,
|
2164 |
+
stepValue: this.options.scaleStepWidth,
|
2165 |
+
min: this.options.scaleStartValue,
|
2166 |
+
max: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth)
|
2167 |
+
});
|
2168 |
+
}
|
2169 |
+
|
2170 |
+
this.scale = new this.ScaleClass(scaleOptions);
|
2171 |
+
},
|
2172 |
+
addData : function(valuesArray,label){
|
2173 |
+
//Map the values array for each of the datasets
|
2174 |
+
helpers.each(valuesArray,function(value,datasetIndex){
|
2175 |
+
//Add a new point for each piece of data, passing any required data to draw.
|
2176 |
+
this.datasets[datasetIndex].bars.push(new this.BarClass({
|
2177 |
+
value : value,
|
2178 |
+
label : label,
|
2179 |
+
x: this.scale.calculateBarX(this.datasets.length, datasetIndex, this.scale.valuesCount+1),
|
2180 |
+
y: this.scale.endPoint,
|
2181 |
+
width : this.scale.calculateBarWidth(this.datasets.length),
|
2182 |
+
base : this.scale.endPoint,
|
2183 |
+
strokeColor : this.datasets[datasetIndex].strokeColor,
|
2184 |
+
fillColor : this.datasets[datasetIndex].fillColor
|
2185 |
+
}));
|
2186 |
+
},this);
|
2187 |
+
|
2188 |
+
this.scale.addXLabel(label);
|
2189 |
+
//Then re-render the chart.
|
2190 |
+
this.update();
|
2191 |
+
},
|
2192 |
+
removeData : function(){
|
2193 |
+
this.scale.removeXLabel();
|
2194 |
+
//Then re-render the chart.
|
2195 |
+
helpers.each(this.datasets,function(dataset){
|
2196 |
+
dataset.bars.shift();
|
2197 |
+
},this);
|
2198 |
+
this.update();
|
2199 |
+
},
|
2200 |
+
reflow : function(){
|
2201 |
+
helpers.extend(this.BarClass.prototype,{
|
2202 |
+
y: this.scale.endPoint,
|
2203 |
+
base : this.scale.endPoint
|
2204 |
+
});
|
2205 |
+
var newScaleProps = helpers.extend({
|
2206 |
+
height : this.chart.height,
|
2207 |
+
width : this.chart.width
|
2208 |
+
});
|
2209 |
+
this.scale.update(newScaleProps);
|
2210 |
+
},
|
2211 |
+
draw : function(ease){
|
2212 |
+
var easingDecimal = ease || 1;
|
2213 |
+
this.clear();
|
2214 |
+
|
2215 |
+
var ctx = this.chart.ctx;
|
2216 |
+
|
2217 |
+
this.scale.draw(easingDecimal);
|
2218 |
+
|
2219 |
+
//Draw all the bars for each dataset
|
2220 |
+
helpers.each(this.datasets,function(dataset,datasetIndex){
|
2221 |
+
helpers.each(dataset.bars,function(bar,index){
|
2222 |
+
if (bar.hasValue()){
|
2223 |
+
bar.base = this.scale.endPoint;
|
2224 |
+
//Transition then draw
|
2225 |
+
bar.transition({
|
2226 |
+
x : this.scale.calculateBarX(this.datasets.length, datasetIndex, index),
|
2227 |
+
y : this.scale.calculateY(bar.value),
|
2228 |
+
width : this.scale.calculateBarWidth(this.datasets.length)
|
2229 |
+
}, easingDecimal).draw();
|
2230 |
+
}
|
2231 |
+
},this);
|
2232 |
+
|
2233 |
+
},this);
|
2234 |
+
}
|
2235 |
+
});
|
2236 |
+
|
2237 |
+
|
2238 |
+
}).call(this);
|
2239 |
+
(function(){
|
2240 |
+
"use strict";
|
2241 |
+
|
2242 |
+
var root = this,
|
2243 |
+
Chart = root.Chart,
|
2244 |
+
//Cache a local reference to Chart.helpers
|
2245 |
+
helpers = Chart.helpers;
|
2246 |
+
|
2247 |
+
var defaultConfig = {
|
2248 |
+
//Boolean - Whether we should show a stroke on each segment
|
2249 |
+
segmentShowStroke : true,
|
2250 |
+
|
2251 |
+
//String - The colour of each segment stroke
|
2252 |
+
segmentStrokeColor : "#fff",
|
2253 |
+
|
2254 |
+
//Number - The width of each segment stroke
|
2255 |
+
segmentStrokeWidth : 2,
|
2256 |
+
|
2257 |
+
//The percentage of the chart that we cut out of the middle.
|
2258 |
+
percentageInnerCutout : 50,
|
2259 |
+
|
2260 |
+
//Number - Amount of animation steps
|
2261 |
+
animationSteps : 100,
|
2262 |
+
|
2263 |
+
//String - Animation easing effect
|
2264 |
+
animationEasing : "easeOutBounce",
|
2265 |
+
|
2266 |
+
//Boolean - Whether we animate the rotation of the Doughnut
|
2267 |
+
animateRotate : true,
|
2268 |
+
|
2269 |
+
//Boolean - Whether we animate scaling the Doughnut from the centre
|
2270 |
+
animateScale : false,
|
2271 |
+
|
2272 |
+
//String - A legend template
|
2273 |
+
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<segments.length; i++){%><li><span style=\"background-color:<%=segments[i].fillColor%>\"></span><%if(segments[i].label){%><%=segments[i].label%><%}%></li><%}%></ul>"
|
2274 |
+
|
2275 |
+
};
|
2276 |
+
|
2277 |
+
|
2278 |
+
Chart.Type.extend({
|
2279 |
+
//Passing in a name registers this chart in the Chart namespace
|
2280 |
+
name: "Doughnut",
|
2281 |
+
//Providing a defaults will also register the deafults in the chart namespace
|
2282 |
+
defaults : defaultConfig,
|
2283 |
+
//Initialize is fired when the chart is initialized - Data is passed in as a parameter
|
2284 |
+
//Config is automatically merged by the core of Chart.js, and is available at this.options
|
2285 |
+
initialize: function(data){
|
2286 |
+
|
2287 |
+
//Declare segments as a static property to prevent inheriting across the Chart type prototype
|
2288 |
+
this.segments = [];
|
2289 |
+
this.outerRadius = (helpers.min([this.chart.width,this.chart.height]) - this.options.segmentStrokeWidth/2)/2;
|
2290 |
+
|
2291 |
+
this.SegmentArc = Chart.Arc.extend({
|
2292 |
+
ctx : this.chart.ctx,
|
2293 |
+
x : this.chart.width/2,
|
2294 |
+
y : this.chart.height/2
|
2295 |
+
});
|
2296 |
+
|
2297 |
+
//Set up tooltip events on the chart
|
2298 |
+
if (this.options.showTooltips){
|
2299 |
+
helpers.bindEvents(this, this.options.tooltipEvents, function(evt){
|
2300 |
+
var activeSegments = (evt.type !== 'mouseout') ? this.getSegmentsAtEvent(evt) : [];
|
2301 |
+
|
2302 |
+
helpers.each(this.segments,function(segment){
|
2303 |
+
segment.restore(["fillColor"]);
|
2304 |
+
});
|
2305 |
+
helpers.each(activeSegments,function(activeSegment){
|
2306 |
+
activeSegment.fillColor = activeSegment.highlightColor;
|
2307 |
+
});
|
2308 |
+
this.showTooltip(activeSegments);
|
2309 |
+
});
|
2310 |
+
}
|
2311 |
+
this.calculateTotal(data);
|
2312 |
+
|
2313 |
+
helpers.each(data,function(datapoint, index){
|
2314 |
+
this.addData(datapoint, index, true);
|
2315 |
+
},this);
|
2316 |
+
|
2317 |
+
this.render();
|
2318 |
+
},
|
2319 |
+
getSegmentsAtEvent : function(e){
|
2320 |
+
var segmentsArray = [];
|
2321 |
+
|
2322 |
+
var location = helpers.getRelativePosition(e);
|
2323 |
+
|
2324 |
+
helpers.each(this.segments,function(segment){
|
2325 |
+
if (segment.inRange(location.x,location.y)) segmentsArray.push(segment);
|
2326 |
+
},this);
|
2327 |
+
return segmentsArray;
|
2328 |
+
},
|
2329 |
+
addData : function(segment, atIndex, silent){
|
2330 |
+
var index = atIndex || this.segments.length;
|
2331 |
+
this.segments.splice(index, 0, new this.SegmentArc({
|
2332 |
+
value : segment.value,
|
2333 |
+
outerRadius : (this.options.animateScale) ? 0 : this.outerRadius,
|
2334 |
+
innerRadius : (this.options.animateScale) ? 0 : (this.outerRadius/100) * this.options.percentageInnerCutout,
|
2335 |
+
fillColor : segment.color,
|
2336 |
+
highlightColor : segment.highlight || segment.color,
|
2337 |
+
showStroke : this.options.segmentShowStroke,
|
2338 |
+
strokeWidth : this.options.segmentStrokeWidth,
|
2339 |
+
strokeColor : this.options.segmentStrokeColor,
|
2340 |
+
startAngle : Math.PI * 1.5,
|
2341 |
+
circumference : (this.options.animateRotate) ? 0 : this.calculateCircumference(segment.value),
|
2342 |
+
label : segment.label
|
2343 |
+
}));
|
2344 |
+
if (!silent){
|
2345 |
+
this.reflow();
|
2346 |
+
this.update();
|
2347 |
+
}
|
2348 |
+
},
|
2349 |
+
calculateCircumference : function(value){
|
2350 |
+
return (Math.PI*2)*(value / this.total);
|
2351 |
+
},
|
2352 |
+
calculateTotal : function(data){
|
2353 |
+
this.total = 0;
|
2354 |
+
helpers.each(data,function(segment){
|
2355 |
+
this.total += segment.value;
|
2356 |
+
},this);
|
2357 |
+
},
|
2358 |
+
update : function(){
|
2359 |
+
this.calculateTotal(this.segments);
|
2360 |
+
|
2361 |
+
// Reset any highlight colours before updating.
|
2362 |
+
helpers.each(this.activeElements, function(activeElement){
|
2363 |
+
activeElement.restore(['fillColor']);
|
2364 |
+
});
|
2365 |
+
|
2366 |
+
helpers.each(this.segments,function(segment){
|
2367 |
+
segment.save();
|
2368 |
+
});
|
2369 |
+
this.render();
|
2370 |
+
},
|
2371 |
+
|
2372 |
+
removeData: function(atIndex){
|
2373 |
+
var indexToDelete = (helpers.isNumber(atIndex)) ? atIndex : this.segments.length-1;
|
2374 |
+
this.segments.splice(indexToDelete, 1);
|
2375 |
+
this.reflow();
|
2376 |
+
this.update();
|
2377 |
+
},
|
2378 |
+
|
2379 |
+
reflow : function(){
|
2380 |
+
helpers.extend(this.SegmentArc.prototype,{
|
2381 |
+
x : this.chart.width/2,
|
2382 |
+
y : this.chart.height/2
|
2383 |
+
});
|
2384 |
+
this.outerRadius = (helpers.min([this.chart.width,this.chart.height]) - this.options.segmentStrokeWidth/2)/2;
|
2385 |
+
helpers.each(this.segments, function(segment){
|
2386 |
+
segment.update({
|
2387 |
+
outerRadius : this.outerRadius,
|
2388 |
+
innerRadius : (this.outerRadius/100) * this.options.percentageInnerCutout
|
2389 |
+
});
|
2390 |
+
}, this);
|
2391 |
+
},
|
2392 |
+
draw : function(easeDecimal){
|
2393 |
+
var animDecimal = (easeDecimal) ? easeDecimal : 1;
|
2394 |
+
this.clear();
|
2395 |
+
helpers.each(this.segments,function(segment,index){
|
2396 |
+
segment.transition({
|
2397 |
+
circumference : this.calculateCircumference(segment.value),
|
2398 |
+
outerRadius : this.outerRadius,
|
2399 |
+
innerRadius : (this.outerRadius/100) * this.options.percentageInnerCutout
|
2400 |
+
},animDecimal);
|
2401 |
+
|
2402 |
+
segment.endAngle = segment.startAngle + segment.circumference;
|
2403 |
+
|
2404 |
+
segment.draw();
|
2405 |
+
if (index === 0){
|
2406 |
+
segment.startAngle = Math.PI * 1.5;
|
2407 |
+
}
|
2408 |
+
//Check to see if it's the last segment, if not get the next and update the start angle
|
2409 |
+
if (index < this.segments.length-1){
|
2410 |
+
this.segments[index+1].startAngle = segment.endAngle;
|
2411 |
+
}
|
2412 |
+
},this);
|
2413 |
+
|
2414 |
+
}
|
2415 |
+
});
|
2416 |
+
|
2417 |
+
Chart.types.Doughnut.extend({
|
2418 |
+
name : "Pie",
|
2419 |
+
defaults : helpers.merge(defaultConfig,{percentageInnerCutout : 0})
|
2420 |
+
});
|
2421 |
+
|
2422 |
+
}).call(this);
|
2423 |
+
(function(){
|
2424 |
+
"use strict";
|
2425 |
+
|
2426 |
+
var root = this,
|
2427 |
+
Chart = root.Chart,
|
2428 |
+
helpers = Chart.helpers;
|
2429 |
+
|
2430 |
+
var defaultConfig = {
|
2431 |
+
|
2432 |
+
///Boolean - Whether grid lines are shown across the chart
|
2433 |
+
scaleShowGridLines : true,
|
2434 |
+
|
2435 |
+
//String - Colour of the grid lines
|
2436 |
+
scaleGridLineColor : "rgba(0,0,0,.05)",
|
2437 |
+
|
2438 |
+
//Number - Width of the grid lines
|
2439 |
+
scaleGridLineWidth : 1,
|
2440 |
+
|
2441 |
+
//Boolean - Whether the line is curved between points
|
2442 |
+
bezierCurve : true,
|
2443 |
+
|
2444 |
+
//Number - Tension of the bezier curve between points
|
2445 |
+
bezierCurveTension : 0.4,
|
2446 |
+
|
2447 |
+
//Boolean - Whether to show a dot for each point
|
2448 |
+
pointDot : true,
|
2449 |
+
|
2450 |
+
//Number - Radius of each point dot in pixels
|
2451 |
+
pointDotRadius : 4,
|
2452 |
+
|
2453 |
+
//Number - Pixel width of point dot stroke
|
2454 |
+
pointDotStrokeWidth : 1,
|
2455 |
+
|
2456 |
+
//Number - amount extra to add to the radius to cater for hit detection outside the drawn point
|
2457 |
+
pointHitDetectionRadius : 20,
|
2458 |
+
|
2459 |
+
//Boolean - Whether to show a stroke for datasets
|
2460 |
+
datasetStroke : true,
|
2461 |
+
|
2462 |
+
//Number - Pixel width of dataset stroke
|
2463 |
+
datasetStrokeWidth : 2,
|
2464 |
+
|
2465 |
+
//Boolean - Whether to fill the dataset with a colour
|
2466 |
+
datasetFill : true,
|
2467 |
+
|
2468 |
+
//String - A legend template
|
2469 |
+
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].strokeColor%>\"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>"
|
2470 |
+
|
2471 |
+
};
|
2472 |
+
|
2473 |
+
|
2474 |
+
Chart.Type.extend({
|
2475 |
+
name: "Line",
|
2476 |
+
defaults : defaultConfig,
|
2477 |
+
initialize: function(data){
|
2478 |
+
//Declare the extension of the default point, to cater for the options passed in to the constructor
|
2479 |
+
this.PointClass = Chart.Point.extend({
|
2480 |
+
strokeWidth : this.options.pointDotStrokeWidth,
|
2481 |
+
radius : this.options.pointDotRadius,
|
2482 |
+
display: this.options.pointDot,
|
2483 |
+
hitDetectionRadius : this.options.pointHitDetectionRadius,
|
2484 |
+
ctx : this.chart.ctx,
|
2485 |
+
inRange : function(mouseX){
|
2486 |
+
return (Math.pow(mouseX-this.x, 2) < Math.pow(this.radius + this.hitDetectionRadius,2));
|
2487 |
+
}
|
2488 |
+
});
|
2489 |
+
|
2490 |
+
this.datasets = [];
|
2491 |
+
|
2492 |
+
//Set up tooltip events on the chart
|
2493 |
+
if (this.options.showTooltips){
|
2494 |
+
helpers.bindEvents(this, this.options.tooltipEvents, function(evt){
|
2495 |
+
var activePoints = (evt.type !== 'mouseout') ? this.getPointsAtEvent(evt) : [];
|
2496 |
+
this.eachPoints(function(point){
|
2497 |
+
point.restore(['fillColor', 'strokeColor']);
|
2498 |
+
});
|
2499 |
+
helpers.each(activePoints, function(activePoint){
|
2500 |
+
activePoint.fillColor = activePoint.highlightFill;
|
2501 |
+
activePoint.strokeColor = activePoint.highlightStroke;
|
2502 |
+
});
|
2503 |
+
this.showTooltip(activePoints);
|
2504 |
+
});
|
2505 |
+
}
|
2506 |
+
|
2507 |
+
//Iterate through each of the datasets, and build this into a property of the chart
|
2508 |
+
helpers.each(data.datasets,function(dataset){
|
2509 |
+
|
2510 |
+
var datasetObject = {
|
2511 |
+
label : dataset.label || null,
|
2512 |
+
fillColor : dataset.fillColor,
|
2513 |
+
strokeColor : dataset.strokeColor,
|
2514 |
+
pointColor : dataset.pointColor,
|
2515 |
+
pointStrokeColor : dataset.pointStrokeColor,
|
2516 |
+
points : []
|
2517 |
+
};
|
2518 |
+
|
2519 |
+
this.datasets.push(datasetObject);
|
2520 |
+
|
2521 |
+
|
2522 |
+
helpers.each(dataset.data,function(dataPoint,index){
|
2523 |
+
//Add a new point for each piece of data, passing any required data to draw.
|
2524 |
+
datasetObject.points.push(new this.PointClass({
|
2525 |
+
value : dataPoint,
|
2526 |
+
label : data.labels[index],
|
2527 |
+
datasetLabel: dataset.label,
|
2528 |
+
strokeColor : dataset.pointStrokeColor,
|
2529 |
+
fillColor : dataset.pointColor,
|
2530 |
+
highlightFill : dataset.pointHighlightFill || dataset.pointColor,
|
2531 |
+
highlightStroke : dataset.pointHighlightStroke || dataset.pointStrokeColor
|
2532 |
+
}));
|
2533 |
+
},this);
|
2534 |
+
|
2535 |
+
this.buildScale(data.labels);
|
2536 |
+
|
2537 |
+
|
2538 |
+
this.eachPoints(function(point, index){
|
2539 |
+
helpers.extend(point, {
|
2540 |
+
x: this.scale.calculateX(index),
|
2541 |
+
y: this.scale.endPoint
|
2542 |
+
});
|
2543 |
+
point.save();
|
2544 |
+
}, this);
|
2545 |
+
|
2546 |
+
},this);
|
2547 |
+
|
2548 |
+
|
2549 |
+
this.render();
|
2550 |
+
},
|
2551 |
+
update : function(){
|
2552 |
+
this.scale.update();
|
2553 |
+
// Reset any highlight colours before updating.
|
2554 |
+
helpers.each(this.activeElements, function(activeElement){
|
2555 |
+
activeElement.restore(['fillColor', 'strokeColor']);
|
2556 |
+
});
|
2557 |
+
this.eachPoints(function(point){
|
2558 |
+
point.save();
|
2559 |
+
});
|
2560 |
+
this.render();
|
2561 |
+
},
|
2562 |
+
eachPoints : function(callback){
|
2563 |
+
helpers.each(this.datasets,function(dataset){
|
2564 |
+
helpers.each(dataset.points,callback,this);
|
2565 |
+
},this);
|
2566 |
+
},
|
2567 |
+
getPointsAtEvent : function(e){
|
2568 |
+
var pointsArray = [],
|
2569 |
+
eventPosition = helpers.getRelativePosition(e);
|
2570 |
+
helpers.each(this.datasets,function(dataset){
|
2571 |
+
helpers.each(dataset.points,function(point){
|
2572 |
+
if (point.inRange(eventPosition.x,eventPosition.y)) pointsArray.push(point);
|
2573 |
+
});
|
2574 |
+
},this);
|
2575 |
+
return pointsArray;
|
2576 |
+
},
|
2577 |
+
buildScale : function(labels){
|
2578 |
+
var self = this;
|
2579 |
+
|
2580 |
+
var dataTotal = function(){
|
2581 |
+
var values = [];
|
2582 |
+
self.eachPoints(function(point){
|
2583 |
+
values.push(point.value);
|
2584 |
+
});
|
2585 |
+
|
2586 |
+
return values;
|
2587 |
+
};
|
2588 |
+
|
2589 |
+
var scaleOptions = {
|
2590 |
+
templateString : this.options.scaleLabel,
|
2591 |
+
height : this.chart.height,
|
2592 |
+
width : this.chart.width,
|
2593 |
+
ctx : this.chart.ctx,
|
2594 |
+
textColor : this.options.scaleFontColor,
|
2595 |
+
fontSize : this.options.scaleFontSize,
|
2596 |
+
fontStyle : this.options.scaleFontStyle,
|
2597 |
+
fontFamily : this.options.scaleFontFamily,
|
2598 |
+
valuesCount : labels.length,
|
2599 |
+
beginAtZero : this.options.scaleBeginAtZero,
|
2600 |
+
integersOnly : this.options.scaleIntegersOnly,
|
2601 |
+
calculateYRange : function(currentHeight){
|
2602 |
+
var updatedRanges = helpers.calculateScaleRange(
|
2603 |
+
dataTotal(),
|
2604 |
+
currentHeight,
|
2605 |
+
this.fontSize,
|
2606 |
+
this.beginAtZero,
|
2607 |
+
this.integersOnly
|
2608 |
+
);
|
2609 |
+
helpers.extend(this, updatedRanges);
|
2610 |
+
},
|
2611 |
+
xLabels : labels,
|
2612 |
+
font : helpers.fontString(this.options.scaleFontSize, this.options.scaleFontStyle, this.options.scaleFontFamily),
|
2613 |
+
lineWidth : this.options.scaleLineWidth,
|
2614 |
+
lineColor : this.options.scaleLineColor,
|
2615 |
+
gridLineWidth : (this.options.scaleShowGridLines) ? this.options.scaleGridLineWidth : 0,
|
2616 |
+
gridLineColor : (this.options.scaleShowGridLines) ? this.options.scaleGridLineColor : "rgba(0,0,0,0)",
|
2617 |
+
padding: (this.options.showScale) ? 0 : this.options.pointDotRadius + this.options.pointDotStrokeWidth,
|
2618 |
+
showLabels : this.options.scaleShowLabels,
|
2619 |
+
display : this.options.showScale
|
2620 |
+
};
|
2621 |
+
|
2622 |
+
if (this.options.scaleOverride){
|
2623 |
+
helpers.extend(scaleOptions, {
|
2624 |
+
calculateYRange: helpers.noop,
|
2625 |
+
steps: this.options.scaleSteps,
|
2626 |
+
stepValue: this.options.scaleStepWidth,
|
2627 |
+
min: this.options.scaleStartValue,
|
2628 |
+
max: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth)
|
2629 |
+
});
|
2630 |
+
}
|
2631 |
+
|
2632 |
+
|
2633 |
+
this.scale = new Chart.Scale(scaleOptions);
|
2634 |
+
},
|
2635 |
+
addData : function(valuesArray,label){
|
2636 |
+
//Map the values array for each of the datasets
|
2637 |
+
|
2638 |
+
helpers.each(valuesArray,function(value,datasetIndex){
|
2639 |
+
//Add a new point for each piece of data, passing any required data to draw.
|
2640 |
+
this.datasets[datasetIndex].points.push(new this.PointClass({
|
2641 |
+
value : value,
|
2642 |
+
label : label,
|
2643 |
+
x: this.scale.calculateX(this.scale.valuesCount+1),
|
2644 |
+
y: this.scale.endPoint,
|
2645 |
+
strokeColor : this.datasets[datasetIndex].pointStrokeColor,
|
2646 |
+
fillColor : this.datasets[datasetIndex].pointColor
|
2647 |
+
}));
|
2648 |
+
},this);
|
2649 |
+
|
2650 |
+
this.scale.addXLabel(label);
|
2651 |
+
//Then re-render the chart.
|
2652 |
+
this.update();
|
2653 |
+
},
|
2654 |
+
removeData : function(){
|
2655 |
+
this.scale.removeXLabel();
|
2656 |
+
//Then re-render the chart.
|
2657 |
+
helpers.each(this.datasets,function(dataset){
|
2658 |
+
dataset.points.shift();
|
2659 |
+
},this);
|
2660 |
+
this.update();
|
2661 |
+
},
|
2662 |
+
reflow : function(){
|
2663 |
+
var newScaleProps = helpers.extend({
|
2664 |
+
height : this.chart.height,
|
2665 |
+
width : this.chart.width
|
2666 |
+
});
|
2667 |
+
this.scale.update(newScaleProps);
|
2668 |
+
},
|
2669 |
+
draw : function(ease){
|
2670 |
+
var easingDecimal = ease || 1;
|
2671 |
+
this.clear();
|
2672 |
+
|
2673 |
+
var ctx = this.chart.ctx;
|
2674 |
+
|
2675 |
+
// Some helper methods for getting the next/prev points
|
2676 |
+
var hasValue = function(item){
|
2677 |
+
return item.value !== null;
|
2678 |
+
},
|
2679 |
+
nextPoint = function(point, collection, index){
|
2680 |
+
return helpers.findNextWhere(collection, hasValue, index) || point;
|
2681 |
+
},
|
2682 |
+
previousPoint = function(point, collection, index){
|
2683 |
+
return helpers.findPreviousWhere(collection, hasValue, index) || point;
|
2684 |
+
};
|
2685 |
+
|
2686 |
+
this.scale.draw(easingDecimal);
|
2687 |
+
|
2688 |
+
|
2689 |
+
helpers.each(this.datasets,function(dataset){
|
2690 |
+
var pointsWithValues = helpers.where(dataset.points, hasValue);
|
2691 |
+
|
2692 |
+
//Transition each point first so that the line and point drawing isn't out of sync
|
2693 |
+
//We can use this extra loop to calculate the control points of this dataset also in this loop
|
2694 |
+
|
2695 |
+
helpers.each(dataset.points, function(point, index){
|
2696 |
+
if (point.hasValue()){
|
2697 |
+
point.transition({
|
2698 |
+
y : this.scale.calculateY(point.value),
|
2699 |
+
x : this.scale.calculateX(index)
|
2700 |
+
}, easingDecimal);
|
2701 |
+
}
|
2702 |
+
},this);
|
2703 |
+
|
2704 |
+
|
2705 |
+
// Control points need to be calculated in a seperate loop, because we need to know the current x/y of the point
|
2706 |
+
// This would cause issues when there is no animation, because the y of the next point would be 0, so beziers would be skewed
|
2707 |
+
if (this.options.bezierCurve){
|
2708 |
+
helpers.each(pointsWithValues, function(point, index){
|
2709 |
+
var tension = (index > 0 && index < pointsWithValues.length - 1) ? this.options.bezierCurveTension : 0;
|
2710 |
+
point.controlPoints = helpers.splineCurve(
|
2711 |
+
previousPoint(point, pointsWithValues, index),
|
2712 |
+
point,
|
2713 |
+
nextPoint(point, pointsWithValues, index),
|
2714 |
+
tension
|
2715 |
+
);
|
2716 |
+
|
2717 |
+
// Prevent the bezier going outside of the bounds of the graph
|
2718 |
+
|
2719 |
+
// Cap puter bezier handles to the upper/lower scale bounds
|
2720 |
+
if (point.controlPoints.outer.y > this.scale.endPoint){
|
2721 |
+
point.controlPoints.outer.y = this.scale.endPoint;
|
2722 |
+
}
|
2723 |
+
else if (point.controlPoints.outer.y < this.scale.startPoint){
|
2724 |
+
point.controlPoints.outer.y = this.scale.startPoint;
|
2725 |
+
}
|
2726 |
+
|
2727 |
+
// Cap inner bezier handles to the upper/lower scale bounds
|
2728 |
+
if (point.controlPoints.inner.y > this.scale.endPoint){
|
2729 |
+
point.controlPoints.inner.y = this.scale.endPoint;
|
2730 |
+
}
|
2731 |
+
else if (point.controlPoints.inner.y < this.scale.startPoint){
|
2732 |
+
point.controlPoints.inner.y = this.scale.startPoint;
|
2733 |
+
}
|
2734 |
+
},this);
|
2735 |
+
}
|
2736 |
+
|
2737 |
+
|
2738 |
+
//Draw the line between all the points
|
2739 |
+
ctx.lineWidth = this.options.datasetStrokeWidth;
|
2740 |
+
ctx.strokeStyle = dataset.strokeColor;
|
2741 |
+
ctx.beginPath();
|
2742 |
+
|
2743 |
+
helpers.each(pointsWithValues, function(point, index){
|
2744 |
+
if (index === 0){
|
2745 |
+
ctx.moveTo(point.x, point.y);
|
2746 |
+
}
|
2747 |
+
else{
|
2748 |
+
if(this.options.bezierCurve){
|
2749 |
+
var previous = previousPoint(point, pointsWithValues, index);
|
2750 |
+
|
2751 |
+
ctx.bezierCurveTo(
|
2752 |
+
previous.controlPoints.outer.x,
|
2753 |
+
previous.controlPoints.outer.y,
|
2754 |
+
point.controlPoints.inner.x,
|
2755 |
+
point.controlPoints.inner.y,
|
2756 |
+
point.x,
|
2757 |
+
point.y
|
2758 |
+
);
|
2759 |
+
}
|
2760 |
+
else{
|
2761 |
+
ctx.lineTo(point.x,point.y);
|
2762 |
+
}
|
2763 |
+
}
|
2764 |
+
}, this);
|
2765 |
+
|
2766 |
+
ctx.stroke();
|
2767 |
+
|
2768 |
+
if (this.options.datasetFill && pointsWithValues.length > 0){
|
2769 |
+
//Round off the line by going to the base of the chart, back to the start, then fill.
|
2770 |
+
ctx.lineTo(pointsWithValues[pointsWithValues.length - 1].x, this.scale.endPoint);
|
2771 |
+
ctx.lineTo(pointsWithValues[0].x, this.scale.endPoint);
|
2772 |
+
ctx.fillStyle = dataset.fillColor;
|
2773 |
+
ctx.closePath();
|
2774 |
+
ctx.fill();
|
2775 |
+
}
|
2776 |
+
|
2777 |
+
//Now draw the points over the line
|
2778 |
+
//A little inefficient double looping, but better than the line
|
2779 |
+
//lagging behind the point positions
|
2780 |
+
helpers.each(pointsWithValues,function(point){
|
2781 |
+
point.draw();
|
2782 |
+
});
|
2783 |
+
},this);
|
2784 |
+
}
|
2785 |
+
});
|
2786 |
+
|
2787 |
+
|
2788 |
+
}).call(this);
|
2789 |
+
(function(){
|
2790 |
+
"use strict";
|
2791 |
+
|
2792 |
+
var root = this,
|
2793 |
+
Chart = root.Chart,
|
2794 |
+
//Cache a local reference to Chart.helpers
|
2795 |
+
helpers = Chart.helpers;
|
2796 |
+
|
2797 |
+
var defaultConfig = {
|
2798 |
+
//Boolean - Show a backdrop to the scale label
|
2799 |
+
scaleShowLabelBackdrop : true,
|
2800 |
+
|
2801 |
+
//String - The colour of the label backdrop
|
2802 |
+
scaleBackdropColor : "rgba(255,255,255,0.75)",
|
2803 |
+
|
2804 |
+
// Boolean - Whether the scale should begin at zero
|
2805 |
+
scaleBeginAtZero : true,
|
2806 |
+
|
2807 |
+
//Number - The backdrop padding above & below the label in pixels
|
2808 |
+
scaleBackdropPaddingY : 2,
|
2809 |
+
|
2810 |
+
//Number - The backdrop padding to the side of the label in pixels
|
2811 |
+
scaleBackdropPaddingX : 2,
|
2812 |
+
|
2813 |
+
//Boolean - Show line for each value in the scale
|
2814 |
+
scaleShowLine : true,
|
2815 |
+
|
2816 |
+
//Boolean - Stroke a line around each segment in the chart
|
2817 |
+
segmentShowStroke : true,
|
2818 |
+
|
2819 |
+
//String - The colour of the stroke on each segement.
|
2820 |
+
segmentStrokeColor : "#fff",
|
2821 |
+
|
2822 |
+
//Number - The width of the stroke value in pixels
|
2823 |
+
segmentStrokeWidth : 2,
|
2824 |
+
|
2825 |
+
//Number - Amount of animation steps
|
2826 |
+
animationSteps : 100,
|
2827 |
+
|
2828 |
+
//String - Animation easing effect.
|
2829 |
+
animationEasing : "easeOutBounce",
|
2830 |
+
|
2831 |
+
//Boolean - Whether to animate the rotation of the chart
|
2832 |
+
animateRotate : true,
|
2833 |
+
|
2834 |
+
//Boolean - Whether to animate scaling the chart from the centre
|
2835 |
+
animateScale : false,
|
2836 |
+
|
2837 |
+
//String - A legend template
|
2838 |
+
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<segments.length; i++){%><li><span style=\"background-color:<%=segments[i].fillColor%>\"></span><%if(segments[i].label){%><%=segments[i].label%><%}%></li><%}%></ul>"
|
2839 |
+
};
|
2840 |
+
|
2841 |
+
|
2842 |
+
Chart.Type.extend({
|
2843 |
+
//Passing in a name registers this chart in the Chart namespace
|
2844 |
+
name: "PolarArea",
|
2845 |
+
//Providing a defaults will also register the deafults in the chart namespace
|
2846 |
+
defaults : defaultConfig,
|
2847 |
+
//Initialize is fired when the chart is initialized - Data is passed in as a parameter
|
2848 |
+
//Config is automatically merged by the core of Chart.js, and is available at this.options
|
2849 |
+
initialize: function(data){
|
2850 |
+
this.segments = [];
|
2851 |
+
//Declare segment class as a chart instance specific class, so it can share props for this instance
|
2852 |
+
this.SegmentArc = Chart.Arc.extend({
|
2853 |
+
showStroke : this.options.segmentShowStroke,
|
2854 |
+
strokeWidth : this.options.segmentStrokeWidth,
|
2855 |
+
strokeColor : this.options.segmentStrokeColor,
|
2856 |
+
ctx : this.chart.ctx,
|
2857 |
+
innerRadius : 0,
|
2858 |
+
x : this.chart.width/2,
|
2859 |
+
y : this.chart.height/2
|
2860 |
+
});
|
2861 |
+
this.scale = new Chart.RadialScale({
|
2862 |
+
display: this.options.showScale,
|
2863 |
+
fontStyle: this.options.scaleFontStyle,
|
2864 |
+
fontSize: this.options.scaleFontSize,
|
2865 |
+
fontFamily: this.options.scaleFontFamily,
|
2866 |
+
fontColor: this.options.scaleFontColor,
|
2867 |
+
showLabels: this.options.scaleShowLabels,
|
2868 |
+
showLabelBackdrop: this.options.scaleShowLabelBackdrop,
|
2869 |
+
backdropColor: this.options.scaleBackdropColor,
|
2870 |
+
backdropPaddingY : this.options.scaleBackdropPaddingY,
|
2871 |
+
backdropPaddingX: this.options.scaleBackdropPaddingX,
|
2872 |
+
lineWidth: (this.options.scaleShowLine) ? this.options.scaleLineWidth : 0,
|
2873 |
+
lineColor: this.options.scaleLineColor,
|
2874 |
+
lineArc: true,
|
2875 |
+
width: this.chart.width,
|
2876 |
+
height: this.chart.height,
|
2877 |
+
xCenter: this.chart.width/2,
|
2878 |
+
yCenter: this.chart.height/2,
|
2879 |
+
ctx : this.chart.ctx,
|
2880 |
+
templateString: this.options.scaleLabel,
|
2881 |
+
valuesCount: data.length
|
2882 |
+
});
|
2883 |
+
|
2884 |
+
this.updateScaleRange(data);
|
2885 |
+
|
2886 |
+
this.scale.update();
|
2887 |
+
|
2888 |
+
helpers.each(data,function(segment,index){
|
2889 |
+
this.addData(segment,index,true);
|
2890 |
+
},this);
|
2891 |
+
|
2892 |
+
//Set up tooltip events on the chart
|
2893 |
+
if (this.options.showTooltips){
|
2894 |
+
helpers.bindEvents(this, this.options.tooltipEvents, function(evt){
|
2895 |
+
var activeSegments = (evt.type !== 'mouseout') ? this.getSegmentsAtEvent(evt) : [];
|
2896 |
+
helpers.each(this.segments,function(segment){
|
2897 |
+
segment.restore(["fillColor"]);
|
2898 |
+
});
|
2899 |
+
helpers.each(activeSegments,function(activeSegment){
|
2900 |
+
activeSegment.fillColor = activeSegment.highlightColor;
|
2901 |
+
});
|
2902 |
+
this.showTooltip(activeSegments);
|
2903 |
+
});
|
2904 |
+
}
|
2905 |
+
|
2906 |
+
this.render();
|
2907 |
+
},
|
2908 |
+
getSegmentsAtEvent : function(e){
|
2909 |
+
var segmentsArray = [];
|
2910 |
+
|
2911 |
+
var location = helpers.getRelativePosition(e);
|
2912 |
+
|
2913 |
+
helpers.each(this.segments,function(segment){
|
2914 |
+
if (segment.inRange(location.x,location.y)) segmentsArray.push(segment);
|
2915 |
+
},this);
|
2916 |
+
return segmentsArray;
|
2917 |
+
},
|
2918 |
+
addData : function(segment, atIndex, silent){
|
2919 |
+
var index = atIndex || this.segments.length;
|
2920 |
+
|
2921 |
+
this.segments.splice(index, 0, new this.SegmentArc({
|
2922 |
+
fillColor: segment.color,
|
2923 |
+
highlightColor: segment.highlight || segment.color,
|
2924 |
+
label: segment.label,
|
2925 |
+
value: segment.value,
|
2926 |
+
outerRadius: (this.options.animateScale) ? 0 : this.scale.calculateCenterOffset(segment.value),
|
2927 |
+
circumference: (this.options.animateRotate) ? 0 : this.scale.getCircumference(),
|
2928 |
+
startAngle: Math.PI * 1.5
|
2929 |
+
}));
|
2930 |
+
if (!silent){
|
2931 |
+
this.reflow();
|
2932 |
+
this.update();
|
2933 |
+
}
|
2934 |
+
},
|
2935 |
+
removeData: function(atIndex){
|
2936 |
+
var indexToDelete = (helpers.isNumber(atIndex)) ? atIndex : this.segments.length-1;
|
2937 |
+
this.segments.splice(indexToDelete, 1);
|
2938 |
+
this.reflow();
|
2939 |
+
this.update();
|
2940 |
+
},
|
2941 |
+
calculateTotal: function(data){
|
2942 |
+
this.total = 0;
|
2943 |
+
helpers.each(data,function(segment){
|
2944 |
+
this.total += segment.value;
|
2945 |
+
},this);
|
2946 |
+
this.scale.valuesCount = this.segments.length;
|
2947 |
+
},
|
2948 |
+
updateScaleRange: function(datapoints){
|
2949 |
+
var valuesArray = [];
|
2950 |
+
helpers.each(datapoints,function(segment){
|
2951 |
+
valuesArray.push(segment.value);
|
2952 |
+
});
|
2953 |
+
|
2954 |
+
var scaleSizes = (this.options.scaleOverride) ?
|
2955 |
+
{
|
2956 |
+
steps: this.options.scaleSteps,
|
2957 |
+
stepValue: this.options.scaleStepWidth,
|
2958 |
+
min: this.options.scaleStartValue,
|
2959 |
+
max: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth)
|
2960 |
+
} :
|
2961 |
+
helpers.calculateScaleRange(
|
2962 |
+
valuesArray,
|
2963 |
+
helpers.min([this.chart.width, this.chart.height])/2,
|
2964 |
+
this.options.scaleFontSize,
|
2965 |
+
this.options.scaleBeginAtZero,
|
2966 |
+
this.options.scaleIntegersOnly
|
2967 |
+
);
|
2968 |
+
|
2969 |
+
helpers.extend(
|
2970 |
+
this.scale,
|
2971 |
+
scaleSizes,
|
2972 |
+
{
|
2973 |
+
size: helpers.min([this.chart.width, this.chart.height]),
|
2974 |
+
xCenter: this.chart.width/2,
|
2975 |
+
yCenter: this.chart.height/2
|
2976 |
+
}
|
2977 |
+
);
|
2978 |
+
|
2979 |
+
},
|
2980 |
+
update : function(){
|
2981 |
+
this.calculateTotal(this.segments);
|
2982 |
+
|
2983 |
+
helpers.each(this.segments,function(segment){
|
2984 |
+
segment.save();
|
2985 |
+
});
|
2986 |
+
this.render();
|
2987 |
+
},
|
2988 |
+
reflow : function(){
|
2989 |
+
helpers.extend(this.SegmentArc.prototype,{
|
2990 |
+
x : this.chart.width/2,
|
2991 |
+
y : this.chart.height/2
|
2992 |
+
});
|
2993 |
+
this.updateScaleRange(this.segments);
|
2994 |
+
this.scale.update();
|
2995 |
+
|
2996 |
+
helpers.extend(this.scale,{
|
2997 |
+
xCenter: this.chart.width/2,
|
2998 |
+
yCenter: this.chart.height/2
|
2999 |
+
});
|
3000 |
+
|
3001 |
+
helpers.each(this.segments, function(segment){
|
3002 |
+
segment.update({
|
3003 |
+
outerRadius : this.scale.calculateCenterOffset(segment.value)
|
3004 |
+
});
|
3005 |
+
}, this);
|
3006 |
+
|
3007 |
+
},
|
3008 |
+
draw : function(ease){
|
3009 |
+
var easingDecimal = ease || 1;
|
3010 |
+
//Clear & draw the canvas
|
3011 |
+
this.clear();
|
3012 |
+
helpers.each(this.segments,function(segment, index){
|
3013 |
+
segment.transition({
|
3014 |
+
circumference : this.scale.getCircumference(),
|
3015 |
+
outerRadius : this.scale.calculateCenterOffset(segment.value)
|
3016 |
+
},easingDecimal);
|
3017 |
+
|
3018 |
+
segment.endAngle = segment.startAngle + segment.circumference;
|
3019 |
+
|
3020 |
+
// If we've removed the first segment we need to set the first one to
|
3021 |
+
// start at the top.
|
3022 |
+
if (index === 0){
|
3023 |
+
segment.startAngle = Math.PI * 1.5;
|
3024 |
+
}
|
3025 |
+
|
3026 |
+
//Check to see if it's the last segment, if not get the next and update the start angle
|
3027 |
+
if (index < this.segments.length - 1){
|
3028 |
+
this.segments[index+1].startAngle = segment.endAngle;
|
3029 |
+
}
|
3030 |
+
segment.draw();
|
3031 |
+
}, this);
|
3032 |
+
this.scale.draw();
|
3033 |
+
}
|
3034 |
+
});
|
3035 |
+
|
3036 |
+
}).call(this);
|
3037 |
+
(function(){
|
3038 |
+
"use strict";
|
3039 |
+
|
3040 |
+
var root = this,
|
3041 |
+
Chart = root.Chart,
|
3042 |
+
helpers = Chart.helpers;
|
3043 |
+
|
3044 |
+
|
3045 |
+
|
3046 |
+
Chart.Type.extend({
|
3047 |
+
name: "Radar",
|
3048 |
+
defaults:{
|
3049 |
+
//Boolean - Whether to show lines for each scale point
|
3050 |
+
scaleShowLine : true,
|
3051 |
+
|
3052 |
+
//Boolean - Whether we show the angle lines out of the radar
|
3053 |
+
angleShowLineOut : true,
|
3054 |
+
|
3055 |
+
//Boolean - Whether to show labels on the scale
|
3056 |
+
scaleShowLabels : false,
|
3057 |
+
|
3058 |
+
// Boolean - Whether the scale should begin at zero
|
3059 |
+
scaleBeginAtZero : true,
|
3060 |
+
|
3061 |
+
//String - Colour of the angle line
|
3062 |
+
angleLineColor : "rgba(0,0,0,.1)",
|
3063 |
+
|
3064 |
+
//Number - Pixel width of the angle line
|
3065 |
+
angleLineWidth : 1,
|
3066 |
+
|
3067 |
+
//String - Point label font declaration
|
3068 |
+
pointLabelFontFamily : "'Arial'",
|
3069 |
+
|
3070 |
+
//String - Point label font weight
|
3071 |
+
pointLabelFontStyle : "normal",
|
3072 |
+
|
3073 |
+
//Number - Point label font size in pixels
|
3074 |
+
pointLabelFontSize : 10,
|
3075 |
+
|
3076 |
+
//String - Point label font colour
|
3077 |
+
pointLabelFontColor : "#666",
|
3078 |
+
|
3079 |
+
//Boolean - Whether to show a dot for each point
|
3080 |
+
pointDot : true,
|
3081 |
+
|
3082 |
+
//Number - Radius of each point dot in pixels
|
3083 |
+
pointDotRadius : 3,
|
3084 |
+
|
3085 |
+
//Number - Pixel width of point dot stroke
|
3086 |
+
pointDotStrokeWidth : 1,
|
3087 |
+
|
3088 |
+
//Number - amount extra to add to the radius to cater for hit detection outside the drawn point
|
3089 |
+
pointHitDetectionRadius : 20,
|
3090 |
+
|
3091 |
+
//Boolean - Whether to show a stroke for datasets
|
3092 |
+
datasetStroke : true,
|
3093 |
+
|
3094 |
+
//Number - Pixel width of dataset stroke
|
3095 |
+
datasetStrokeWidth : 2,
|
3096 |
+
|
3097 |
+
//Boolean - Whether to fill the dataset with a colour
|
3098 |
+
datasetFill : true,
|
3099 |
+
|
3100 |
+
//String - A legend template
|
3101 |
+
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].strokeColor%>\"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>"
|
3102 |
+
|
3103 |
+
},
|
3104 |
+
|
3105 |
+
initialize: function(data){
|
3106 |
+
this.PointClass = Chart.Point.extend({
|
3107 |
+
strokeWidth : this.options.pointDotStrokeWidth,
|
3108 |
+
radius : this.options.pointDotRadius,
|
3109 |
+
display: this.options.pointDot,
|
3110 |
+
hitDetectionRadius : this.options.pointHitDetectionRadius,
|
3111 |
+
ctx : this.chart.ctx
|
3112 |
+
});
|
3113 |
+
|
3114 |
+
this.datasets = [];
|
3115 |
+
|
3116 |
+
this.buildScale(data);
|
3117 |
+
|
3118 |
+
//Set up tooltip events on the chart
|
3119 |
+
if (this.options.showTooltips){
|
3120 |
+
helpers.bindEvents(this, this.options.tooltipEvents, function(evt){
|
3121 |
+
var activePointsCollection = (evt.type !== 'mouseout') ? this.getPointsAtEvent(evt) : [];
|
3122 |
+
|
3123 |
+
this.eachPoints(function(point){
|
3124 |
+
point.restore(['fillColor', 'strokeColor']);
|
3125 |
+
});
|
3126 |
+
helpers.each(activePointsCollection, function(activePoint){
|
3127 |
+
activePoint.fillColor = activePoint.highlightFill;
|
3128 |
+
activePoint.strokeColor = activePoint.highlightStroke;
|
3129 |
+
});
|
3130 |
+
|
3131 |
+
this.showTooltip(activePointsCollection);
|
3132 |
+
});
|
3133 |
+
}
|
3134 |
+
|
3135 |
+
//Iterate through each of the datasets, and build this into a property of the chart
|
3136 |
+
helpers.each(data.datasets,function(dataset){
|
3137 |
+
|
3138 |
+
var datasetObject = {
|
3139 |
+
label: dataset.label || null,
|
3140 |
+
fillColor : dataset.fillColor,
|
3141 |
+
strokeColor : dataset.strokeColor,
|
3142 |
+
pointColor : dataset.pointColor,
|
3143 |
+
pointStrokeColor : dataset.pointStrokeColor,
|
3144 |
+
points : []
|
3145 |
+
};
|
3146 |
+
|
3147 |
+
this.datasets.push(datasetObject);
|
3148 |
+
|
3149 |
+
helpers.each(dataset.data,function(dataPoint,index){
|
3150 |
+
//Add a new point for each piece of data, passing any required data to draw.
|
3151 |
+
var pointPosition;
|
3152 |
+
if (!this.scale.animation){
|
3153 |
+
pointPosition = this.scale.getPointPosition(index, this.scale.calculateCenterOffset(dataPoint));
|
3154 |
+
}
|
3155 |
+
datasetObject.points.push(new this.PointClass({
|
3156 |
+
value : dataPoint,
|
3157 |
+
label : data.labels[index],
|
3158 |
+
datasetLabel: dataset.label,
|
3159 |
+
x: (this.options.animation) ? this.scale.xCenter : pointPosition.x,
|
3160 |
+
y: (this.options.animation) ? this.scale.yCenter : pointPosition.y,
|
3161 |
+
strokeColor : dataset.pointStrokeColor,
|
3162 |
+
fillColor : dataset.pointColor,
|
3163 |
+
highlightFill : dataset.pointHighlightFill || dataset.pointColor,
|
3164 |
+
highlightStroke : dataset.pointHighlightStroke || dataset.pointStrokeColor
|
3165 |
+
}));
|
3166 |
+
},this);
|
3167 |
+
|
3168 |
+
},this);
|
3169 |
+
|
3170 |
+
this.render();
|
3171 |
+
},
|
3172 |
+
eachPoints : function(callback){
|
3173 |
+
helpers.each(this.datasets,function(dataset){
|
3174 |
+
helpers.each(dataset.points,callback,this);
|
3175 |
+
},this);
|
3176 |
+
},
|
3177 |
+
|
3178 |
+
getPointsAtEvent : function(evt){
|
3179 |
+
var mousePosition = helpers.getRelativePosition(evt),
|
3180 |
+
fromCenter = helpers.getAngleFromPoint({
|
3181 |
+
x: this.scale.xCenter,
|
3182 |
+
y: this.scale.yCenter
|
3183 |
+
}, mousePosition);
|
3184 |
+
|
3185 |
+
var anglePerIndex = (Math.PI * 2) /this.scale.valuesCount,
|
3186 |
+
pointIndex = Math.round((fromCenter.angle - Math.PI * 1.5) / anglePerIndex),
|
3187 |
+
activePointsCollection = [];
|
3188 |
+
|
3189 |
+
// If we're at the top, make the pointIndex 0 to get the first of the array.
|
3190 |
+
if (pointIndex >= this.scale.valuesCount || pointIndex < 0){
|
3191 |
+
pointIndex = 0;
|
3192 |
+
}
|
3193 |
+
|
3194 |
+
if (fromCenter.distance <= this.scale.drawingArea){
|
3195 |
+
helpers.each(this.datasets, function(dataset){
|
3196 |
+
activePointsCollection.push(dataset.points[pointIndex]);
|
3197 |
+
});
|
3198 |
+
}
|
3199 |
+
|
3200 |
+
return activePointsCollection;
|
3201 |
+
},
|
3202 |
+
|
3203 |
+
buildScale : function(data){
|
3204 |
+
this.scale = new Chart.RadialScale({
|
3205 |
+
display: this.options.showScale,
|
3206 |
+
fontStyle: this.options.scaleFontStyle,
|
3207 |
+
fontSize: this.options.scaleFontSize,
|
3208 |
+
fontFamily: this.options.scaleFontFamily,
|
3209 |
+
fontColor: this.options.scaleFontColor,
|
3210 |
+
showLabels: this.options.scaleShowLabels,
|
3211 |
+
showLabelBackdrop: this.options.scaleShowLabelBackdrop,
|
3212 |
+
backdropColor: this.options.scaleBackdropColor,
|
3213 |
+
backdropPaddingY : this.options.scaleBackdropPaddingY,
|
3214 |
+
backdropPaddingX: this.options.scaleBackdropPaddingX,
|
3215 |
+
lineWidth: (this.options.scaleShowLine) ? this.options.scaleLineWidth : 0,
|
3216 |
+
lineColor: this.options.scaleLineColor,
|
3217 |
+
angleLineColor : this.options.angleLineColor,
|
3218 |
+
angleLineWidth : (this.options.angleShowLineOut) ? this.options.angleLineWidth : 0,
|
3219 |
+
// Point labels at the edge of each line
|
3220 |
+
pointLabelFontColor : this.options.pointLabelFontColor,
|
3221 |
+
pointLabelFontSize : this.options.pointLabelFontSize,
|
3222 |
+
pointLabelFontFamily : this.options.pointLabelFontFamily,
|
3223 |
+
pointLabelFontStyle : this.options.pointLabelFontStyle,
|
3224 |
+
height : this.chart.height,
|
3225 |
+
width: this.chart.width,
|
3226 |
+
xCenter: this.chart.width/2,
|
3227 |
+
yCenter: this.chart.height/2,
|
3228 |
+
ctx : this.chart.ctx,
|
3229 |
+
templateString: this.options.scaleLabel,
|
3230 |
+
labels: data.labels,
|
3231 |
+
valuesCount: data.datasets[0].data.length
|
3232 |
+
});
|
3233 |
+
|
3234 |
+
this.scale.setScaleSize();
|
3235 |
+
this.updateScaleRange(data.datasets);
|
3236 |
+
this.scale.buildYLabels();
|
3237 |
+
},
|
3238 |
+
updateScaleRange: function(datasets){
|
3239 |
+
var valuesArray = (function(){
|
3240 |
+
var totalDataArray = [];
|
3241 |
+
helpers.each(datasets,function(dataset){
|
3242 |
+
if (dataset.data){
|
3243 |
+
totalDataArray = totalDataArray.concat(dataset.data);
|
3244 |
+
}
|
3245 |
+
else {
|
3246 |
+
helpers.each(dataset.points, function(point){
|
3247 |
+
totalDataArray.push(point.value);
|
3248 |
+
});
|
3249 |
+
}
|
3250 |
+
});
|
3251 |
+
return totalDataArray;
|
3252 |
+
})();
|
3253 |
+
|
3254 |
+
|
3255 |
+
var scaleSizes = (this.options.scaleOverride) ?
|
3256 |
+
{
|
3257 |
+
steps: this.options.scaleSteps,
|
3258 |
+
stepValue: this.options.scaleStepWidth,
|
3259 |
+
min: this.options.scaleStartValue,
|
3260 |
+
max: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth)
|
3261 |
+
} :
|
3262 |
+
helpers.calculateScaleRange(
|
3263 |
+
valuesArray,
|
3264 |
+
helpers.min([this.chart.width, this.chart.height])/2,
|
3265 |
+
this.options.scaleFontSize,
|
3266 |
+
this.options.scaleBeginAtZero,
|
3267 |
+
this.options.scaleIntegersOnly
|
3268 |
+
);
|
3269 |
+
|
3270 |
+
helpers.extend(
|
3271 |
+
this.scale,
|
3272 |
+
scaleSizes
|
3273 |
+
);
|
3274 |
+
|
3275 |
+
},
|
3276 |
+
addData : function(valuesArray,label){
|
3277 |
+
//Map the values array for each of the datasets
|
3278 |
+
this.scale.valuesCount++;
|
3279 |
+
helpers.each(valuesArray,function(value,datasetIndex){
|
3280 |
+
var pointPosition = this.scale.getPointPosition(this.scale.valuesCount, this.scale.calculateCenterOffset(value));
|
3281 |
+
this.datasets[datasetIndex].points.push(new this.PointClass({
|
3282 |
+
value : value,
|
3283 |
+
label : label,
|
3284 |
+
x: pointPosition.x,
|
3285 |
+
y: pointPosition.y,
|
3286 |
+
strokeColor : this.datasets[datasetIndex].pointStrokeColor,
|
3287 |
+
fillColor : this.datasets[datasetIndex].pointColor
|
3288 |
+
}));
|
3289 |
+
},this);
|
3290 |
+
|
3291 |
+
this.scale.labels.push(label);
|
3292 |
+
|
3293 |
+
this.reflow();
|
3294 |
+
|
3295 |
+
this.update();
|
3296 |
+
},
|
3297 |
+
removeData : function(){
|
3298 |
+
this.scale.valuesCount--;
|
3299 |
+
this.scale.labels.shift();
|
3300 |
+
helpers.each(this.datasets,function(dataset){
|
3301 |
+
dataset.points.shift();
|
3302 |
+
},this);
|
3303 |
+
this.reflow();
|
3304 |
+
this.update();
|
3305 |
+
},
|
3306 |
+
update : function(){
|
3307 |
+
this.eachPoints(function(point){
|
3308 |
+
point.save();
|
3309 |
+
});
|
3310 |
+
this.reflow();
|
3311 |
+
this.render();
|
3312 |
+
},
|
3313 |
+
reflow: function(){
|
3314 |
+
helpers.extend(this.scale, {
|
3315 |
+
width : this.chart.width,
|
3316 |
+
height: this.chart.height,
|
3317 |
+
size : helpers.min([this.chart.width, this.chart.height]),
|
3318 |
+
xCenter: this.chart.width/2,
|
3319 |
+
yCenter: this.chart.height/2
|
3320 |
+
});
|
3321 |
+
this.updateScaleRange(this.datasets);
|
3322 |
+
this.scale.setScaleSize();
|
3323 |
+
this.scale.buildYLabels();
|
3324 |
+
},
|
3325 |
+
draw : function(ease){
|
3326 |
+
var easeDecimal = ease || 1,
|
3327 |
+
ctx = this.chart.ctx;
|
3328 |
+
this.clear();
|
3329 |
+
this.scale.draw();
|
3330 |
+
|
3331 |
+
helpers.each(this.datasets,function(dataset){
|
3332 |
+
|
3333 |
+
//Transition each point first so that the line and point drawing isn't out of sync
|
3334 |
+
helpers.each(dataset.points,function(point,index){
|
3335 |
+
if (point.hasValue()){
|
3336 |
+
point.transition(this.scale.getPointPosition(index, this.scale.calculateCenterOffset(point.value)), easeDecimal);
|
3337 |
+
}
|
3338 |
+
},this);
|
3339 |
+
|
3340 |
+
|
3341 |
+
|
3342 |
+
//Draw the line between all the points
|
3343 |
+
ctx.lineWidth = this.options.datasetStrokeWidth;
|
3344 |
+
ctx.strokeStyle = dataset.strokeColor;
|
3345 |
+
ctx.beginPath();
|
3346 |
+
helpers.each(dataset.points,function(point,index){
|
3347 |
+
if (index === 0){
|
3348 |
+
ctx.moveTo(point.x,point.y);
|
3349 |
+
}
|
3350 |
+
else{
|
3351 |
+
ctx.lineTo(point.x,point.y);
|
3352 |
+
}
|
3353 |
+
},this);
|
3354 |
+
ctx.closePath();
|
3355 |
+
ctx.stroke();
|
3356 |
+
|
3357 |
+
ctx.fillStyle = dataset.fillColor;
|
3358 |
+
ctx.fill();
|
3359 |
+
|
3360 |
+
//Now draw the points over the line
|
3361 |
+
//A little inefficient double looping, but better than the line
|
3362 |
+
//lagging behind the point positions
|
3363 |
+
helpers.each(dataset.points,function(point){
|
3364 |
+
if (point.hasValue()){
|
3365 |
+
point.draw();
|
3366 |
+
}
|
3367 |
+
});
|
3368 |
+
|
3369 |
+
},this);
|
3370 |
+
|
3371 |
+
}
|
3372 |
+
|
3373 |
+
});
|
3374 |
+
|
3375 |
+
|
3376 |
+
|
3377 |
+
|
3378 |
+
|
3379 |
+
}).call(this);
|
lib/Chart_js/Chart.min.js
ADDED
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*!
|
2 |
+
* Chart.js
|
3 |
+
* http://chartjs.org/
|
4 |
+
* Version: 1.0.1-beta.4
|
5 |
+
*
|
6 |
+
* Copyright 2014 Nick Downie
|
7 |
+
* Released under the MIT license
|
8 |
+
* https://github.com/nnnick/Chart.js/blob/master/LICENSE.md
|
9 |
+
*/
|
10 |
+
(function(){"use strict";var t=this,i=t.Chart,e=function(t){this.canvas=t.canvas,this.ctx=t;this.width=t.canvas.width,this.height=t.canvas.height;return this.aspectRatio=this.width/this.height,s.retinaScale(this),this};e.defaults={global:{animation:!0,animationSteps:60,animationEasing:"easeOutQuart",showScale:!0,scaleOverride:!1,scaleSteps:null,scaleStepWidth:null,scaleStartValue:null,scaleLineColor:"rgba(0,0,0,.1)",scaleLineWidth:1,scaleShowLabels:!0,scaleLabel:"<%=value%>",scaleIntegersOnly:!0,scaleBeginAtZero:!1,scaleFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",scaleFontSize:12,scaleFontStyle:"normal",scaleFontColor:"#666",responsive:!1,maintainAspectRatio:!0,showTooltips:!0,tooltipEvents:["mousemove","touchstart","touchmove","mouseout"],tooltipFillColor:"rgba(0,0,0,0.8)",tooltipFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",tooltipFontSize:14,tooltipFontStyle:"normal",tooltipFontColor:"#fff",tooltipTitleFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",tooltipTitleFontSize:14,tooltipTitleFontStyle:"bold",tooltipTitleFontColor:"#fff",tooltipYPadding:6,tooltipXPadding:6,tooltipCaretSize:8,tooltipCornerRadius:6,tooltipXOffset:10,tooltipTemplate:"<%if (label){%><%=label%>: <%}%><%= value %>",multiTooltipTemplate:"<%= value %>",multiTooltipKeyBackground:"#fff",onAnimationProgress:function(){},onAnimationComplete:function(){}}},e.types={};var s=e.helpers={},n=s.each=function(t,i,e){var s=Array.prototype.slice.call(arguments,3);if(t)if(t.length===+t.length){var n;for(n=0;n<t.length;n++)i.apply(e,[t[n],n].concat(s))}else for(var o in t)i.apply(e,[t[o],o].concat(s))},o=s.clone=function(t){var i={};return n(t,function(e,s){t.hasOwnProperty(s)&&(i[s]=e)}),i},a=s.extend=function(t){return n(Array.prototype.slice.call(arguments,1),function(i){n(i,function(e,s){i.hasOwnProperty(s)&&(t[s]=e)})}),t},h=s.merge=function(){var t=Array.prototype.slice.call(arguments,0);return t.unshift({}),a.apply(null,t)},l=s.indexOf=function(t,i){if(Array.prototype.indexOf)return t.indexOf(i);for(var e=0;e<t.length;e++)if(t[e]===i)return e;return-1},r=(s.where=function(t,i){var e=[];return s.each(t,function(t){i(t)&&e.push(t)}),e},s.findNextWhere=function(t,i,e){e||(e=-1);for(var s=e+1;s<t.length;s++){var n=t[s];if(i(n))return n}},s.findPreviousWhere=function(t,i,e){e||(e=t.length);for(var s=e-1;s>=0;s--){var n=t[s];if(i(n))return n}},s.inherits=function(t){var i=this,e=t&&t.hasOwnProperty("constructor")?t.constructor:function(){return i.apply(this,arguments)},s=function(){this.constructor=e};return s.prototype=i.prototype,e.prototype=new s,e.extend=r,t&&a(e.prototype,t),e.__super__=i.prototype,e}),c=s.noop=function(){},u=s.uid=function(){var t=0;return function(){return"chart-"+t++}}(),d=s.warn=function(t){window.console&&"function"==typeof window.console.warn&&console.warn(t)},p=s.amd="function"==typeof t.define&&t.define.amd,f=s.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},g=s.max=function(t){return Math.max.apply(Math,t)},m=s.min=function(t){return Math.min.apply(Math,t)},v=(s.cap=function(t,i,e){if(f(i)){if(t>i)return i}else if(f(e)&&e>t)return e;return t},s.getDecimalPlaces=function(t){return t%1!==0&&f(t)?t.toString().split(".")[1].length:0}),x=s.radians=function(t){return t*(Math.PI/180)},S=(s.getAngleFromPoint=function(t,i){var e=i.x-t.x,s=i.y-t.y,n=Math.sqrt(e*e+s*s),o=2*Math.PI+Math.atan2(s,e);return 0>e&&0>s&&(o+=2*Math.PI),{angle:o,distance:n}},s.aliasPixel=function(t){return t%2===0?0:.5}),y=(s.splineCurve=function(t,i,e,s){var n=Math.sqrt(Math.pow(i.x-t.x,2)+Math.pow(i.y-t.y,2)),o=Math.sqrt(Math.pow(e.x-i.x,2)+Math.pow(e.y-i.y,2)),a=s*n/(n+o),h=s*o/(n+o);return{inner:{x:i.x-a*(e.x-t.x),y:i.y-a*(e.y-t.y)},outer:{x:i.x+h*(e.x-t.x),y:i.y+h*(e.y-t.y)}}},s.calculateOrderOfMagnitude=function(t){return Math.floor(Math.log(t)/Math.LN10)}),C=(s.calculateScaleRange=function(t,i,e,s,n){var o=2,a=Math.floor(i/(1.5*e)),h=o>=a,l=g(t),r=m(t);l===r&&(l+=.5,r>=.5&&!s?r-=.5:l+=.5);for(var c=Math.abs(l-r),u=y(c),d=Math.ceil(l/(1*Math.pow(10,u)))*Math.pow(10,u),p=s?0:Math.floor(r/(1*Math.pow(10,u)))*Math.pow(10,u),f=d-p,v=Math.pow(10,u),x=Math.round(f/v);(x>a||a>2*x)&&!h;)if(x>a)v*=2,x=Math.round(f/v),x%1!==0&&(h=!0);else if(n&&u>=0){if(v/2%1!==0)break;v/=2,x=Math.round(f/v)}else v/=2,x=Math.round(f/v);return h&&(x=o,v=f/x),{steps:x,stepValue:v,min:p,max:p+x*v}},s.template=function(t,i){function e(t,i){var e=/\W/.test(t)?new Function("obj","var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('"+t.replace(/[\r\t\n]/g," ").split("<%").join(" ").replace(/((^|%>)[^\t]*)'/g,"$1\r").replace(/\t=(.*?)%>/g,"',$1,'").split(" ").join("');").split("%>").join("p.push('").split("\r").join("\\'")+"');}return p.join('');"):s[t]=s[t];return i?e(i):e}if(t instanceof Function)return t(i);var s={};return e(t,i)}),b=(s.generateLabels=function(t,i,e,s){var o=new Array(i);return labelTemplateString&&n(o,function(i,n){o[n]=C(t,{value:e+s*(n+1)})}),o},s.easingEffects={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-1*t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-0.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return 1*((t=t/1-1)*t*t+1)},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-1*((t=t/1-1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-0.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return 1*(t/=1)*t*t*t*t},easeOutQuint:function(t){return 1*((t=t/1-1)*t*t*t*t+1)},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return-1*Math.cos(t/1*(Math.PI/2))+1},easeOutSine:function(t){return 1*Math.sin(t/1*(Math.PI/2))},easeInOutSine:function(t){return-0.5*(Math.cos(Math.PI*t/1)-1)},easeInExpo:function(t){return 0===t?1:1*Math.pow(2,10*(t/1-1))},easeOutExpo:function(t){return 1===t?1:1*(-Math.pow(2,-10*t/1)+1)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(-Math.pow(2,-10*--t)+2)},easeInCirc:function(t){return t>=1?t:-1*(Math.sqrt(1-(t/=1)*t)-1)},easeOutCirc:function(t){return 1*Math.sqrt(1-(t=t/1-1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-0.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var i=1.70158,e=0,s=1;return 0===t?0:1==(t/=1)?1:(e||(e=.3),s<Math.abs(1)?(s=1,i=e/4):i=e/(2*Math.PI)*Math.asin(1/s),-(s*Math.pow(2,10*(t-=1))*Math.sin(2*(1*t-i)*Math.PI/e)))},easeOutElastic:function(t){var i=1.70158,e=0,s=1;return 0===t?0:1==(t/=1)?1:(e||(e=.3),s<Math.abs(1)?(s=1,i=e/4):i=e/(2*Math.PI)*Math.asin(1/s),s*Math.pow(2,-10*t)*Math.sin(2*(1*t-i)*Math.PI/e)+1)},easeInOutElastic:function(t){var i=1.70158,e=0,s=1;return 0===t?0:2==(t/=.5)?1:(e||(e=.3*1.5),s<Math.abs(1)?(s=1,i=e/4):i=e/(2*Math.PI)*Math.asin(1/s),1>t?-.5*s*Math.pow(2,10*(t-=1))*Math.sin(2*(1*t-i)*Math.PI/e):s*Math.pow(2,-10*(t-=1))*Math.sin(2*(1*t-i)*Math.PI/e)*.5+1)},easeInBack:function(t){var i=1.70158;return 1*(t/=1)*t*((i+1)*t-i)},easeOutBack:function(t){var i=1.70158;return 1*((t=t/1-1)*t*((i+1)*t+i)+1)},easeInOutBack:function(t){var i=1.70158;return(t/=.5)<1?.5*t*t*(((i*=1.525)+1)*t-i):.5*((t-=2)*t*(((i*=1.525)+1)*t+i)+2)},easeInBounce:function(t){return 1-b.easeOutBounce(1-t)},easeOutBounce:function(t){return(t/=1)<1/2.75?7.5625*t*t:2/2.75>t?1*(7.5625*(t-=1.5/2.75)*t+.75):2.5/2.75>t?1*(7.5625*(t-=2.25/2.75)*t+.9375):1*(7.5625*(t-=2.625/2.75)*t+.984375)},easeInOutBounce:function(t){return.5>t?.5*b.easeInBounce(2*t):.5*b.easeOutBounce(2*t-1)+.5}}),w=s.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)}}(),P=(s.cancelAnimFrame=function(){return window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||window.oCancelAnimationFrame||window.msCancelAnimationFrame||function(t){return window.clearTimeout(t,1e3/60)}}(),s.animationLoop=function(t,i,e,s,n,o){var a=0,h=b[e]||b.linear,l=function(){a++;var e=a/i,r=h(e);t.call(o,r,e,a),s.call(o,r,e),i>a?o.animationFrame=w(l):n.apply(o)};w(l)},s.getRelativePosition=function(t){var i,e,s=t.originalEvent||t,n=t.currentTarget||t.srcElement,o=n.getBoundingClientRect();return s.touches?(i=s.touches[0].clientX-o.left,e=s.touches[0].clientY-o.top):(i=s.clientX-o.left,e=s.clientY-o.top),{x:i,y:e}},s.addEvent=function(t,i,e){t.addEventListener?t.addEventListener(i,e):t.attachEvent?t.attachEvent("on"+i,e):t["on"+i]=e}),L=s.removeEvent=function(t,i,e){t.removeEventListener?t.removeEventListener(i,e,!1):t.detachEvent?t.detachEvent("on"+i,e):t["on"+i]=c},k=(s.bindEvents=function(t,i,e){t.events||(t.events={}),n(i,function(i){t.events[i]=function(){e.apply(t,arguments)},P(t.chart.canvas,i,t.events[i])})},s.unbindEvents=function(t,i){n(i,function(i,e){L(t.chart.canvas,e,i)})}),F=s.getMaximumWidth=function(t){var i=t.parentNode;return i.clientWidth},R=s.getMaximumHeight=function(t){var i=t.parentNode;return i.clientHeight},A=(s.getMaximumSize=s.getMaximumWidth,s.retinaScale=function(t){var i=t.ctx,e=t.canvas.width,s=t.canvas.height;window.devicePixelRatio&&(i.canvas.style.width=e+"px",i.canvas.style.height=s+"px",i.canvas.height=s*window.devicePixelRatio,i.canvas.width=e*window.devicePixelRatio,i.scale(window.devicePixelRatio,window.devicePixelRatio))}),T=s.clear=function(t){t.ctx.clearRect(0,0,t.width,t.height)},M=s.fontString=function(t,i,e){return i+" "+t+"px "+e},W=s.longestText=function(t,i,e){t.font=i;var s=0;return n(e,function(i){var e=t.measureText(i).width;s=e>s?e:s}),s},z=s.drawRoundedRectangle=function(t,i,e,s,n,o){t.beginPath(),t.moveTo(i+o,e),t.lineTo(i+s-o,e),t.quadraticCurveTo(i+s,e,i+s,e+o),t.lineTo(i+s,e+n-o),t.quadraticCurveTo(i+s,e+n,i+s-o,e+n),t.lineTo(i+o,e+n),t.quadraticCurveTo(i,e+n,i,e+n-o),t.lineTo(i,e+o),t.quadraticCurveTo(i,e,i+o,e),t.closePath()};e.instances={},e.Type=function(t,i,s){this.options=i,this.chart=s,this.id=u(),e.instances[this.id]=this,i.responsive&&this.resize(),this.initialize.call(this,t)},a(e.Type.prototype,{initialize:function(){return this},clear:function(){return T(this.chart),this},stop:function(){return s.cancelAnimFrame.call(t,this.animationFrame),this},resize:function(t){this.stop();var i=this.chart.canvas,e=F(this.chart.canvas),s=this.options.maintainAspectRatio?e/this.chart.aspectRatio:R(this.chart.canvas);return i.width=this.chart.width=e,i.height=this.chart.height=s,A(this.chart),"function"==typeof t&&t.apply(this,Array.prototype.slice.call(arguments,1)),this},reflow:c,render:function(t){return t&&this.reflow(),this.options.animation&&!t?s.animationLoop(this.draw,this.options.animationSteps,this.options.animationEasing,this.options.onAnimationProgress,this.options.onAnimationComplete,this):(this.draw(),this.options.onAnimationComplete.call(this)),this},generateLegend:function(){return C(this.options.legendTemplate,this)},destroy:function(){this.clear(),k(this,this.events),delete e.instances[this.id]},showTooltip:function(t,i){"undefined"==typeof this.activeElements&&(this.activeElements=[]);var o=function(t){var i=!1;return t.length!==this.activeElements.length?i=!0:(n(t,function(t,e){t!==this.activeElements[e]&&(i=!0)},this),i)}.call(this,t);if(o||i){if(this.activeElements=t,this.draw(),t.length>0)if(this.datasets&&this.datasets.length>1){for(var a,h,r=this.datasets.length-1;r>=0&&(a=this.datasets[r].points||this.datasets[r].bars||this.datasets[r].segments,h=l(a,t[0]),-1===h);r--);var c=[],u=[],d=function(){var t,i,e,n,o,a=[],l=[],r=[];return s.each(this.datasets,function(i){t=i.points||i.bars||i.segments,t[h]&&t[h].hasValue()&&a.push(t[h])}),s.each(a,function(t){l.push(t.x),r.push(t.y),c.push(s.template(this.options.multiTooltipTemplate,t)),u.push({fill:t._saved.fillColor||t.fillColor,stroke:t._saved.strokeColor||t.strokeColor})},this),o=m(r),e=g(r),n=m(l),i=g(l),{x:n>this.chart.width/2?n:i,y:(o+e)/2}}.call(this,h);new e.MultiTooltip({x:d.x,y:d.y,xPadding:this.options.tooltipXPadding,yPadding:this.options.tooltipYPadding,xOffset:this.options.tooltipXOffset,fillColor:this.options.tooltipFillColor,textColor:this.options.tooltipFontColor,fontFamily:this.options.tooltipFontFamily,fontStyle:this.options.tooltipFontStyle,fontSize:this.options.tooltipFontSize,titleTextColor:this.options.tooltipTitleFontColor,titleFontFamily:this.options.tooltipTitleFontFamily,titleFontStyle:this.options.tooltipTitleFontStyle,titleFontSize:this.options.tooltipTitleFontSize,cornerRadius:this.options.tooltipCornerRadius,labels:c,legendColors:u,legendColorBackground:this.options.multiTooltipKeyBackground,title:t[0].label,chart:this.chart,ctx:this.chart.ctx}).draw()}else n(t,function(t){var i=t.tooltipPosition();new e.Tooltip({x:Math.round(i.x),y:Math.round(i.y),xPadding:this.options.tooltipXPadding,yPadding:this.options.tooltipYPadding,fillColor:this.options.tooltipFillColor,textColor:this.options.tooltipFontColor,fontFamily:this.options.tooltipFontFamily,fontStyle:this.options.tooltipFontStyle,fontSize:this.options.tooltipFontSize,caretHeight:this.options.tooltipCaretSize,cornerRadius:this.options.tooltipCornerRadius,text:C(this.options.tooltipTemplate,t),chart:this.chart}).draw()},this);return this}},toBase64Image:function(){return this.chart.canvas.toDataURL.apply(this.chart.canvas,arguments)}}),e.Type.extend=function(t){var i=this,s=function(){return i.apply(this,arguments)};if(s.prototype=o(i.prototype),a(s.prototype,t),s.extend=e.Type.extend,t.name||i.prototype.name){var n=t.name||i.prototype.name,l=e.defaults[i.prototype.name]?o(e.defaults[i.prototype.name]):{};e.defaults[n]=a(l,t.defaults),e.types[n]=s,e.prototype[n]=function(t,i){var o=h(e.defaults.global,e.defaults[n],i||{});return new s(t,o,this)}}else d("Name not provided for this chart, so it hasn't been registered");return i},e.Element=function(t){a(this,t),this.initialize.apply(this,arguments),this.save()},a(e.Element.prototype,{initialize:function(){},restore:function(t){return t?n(t,function(t){this[t]=this._saved[t]},this):a(this,this._saved),this},save:function(){return this._saved=o(this),delete this._saved._saved,this},update:function(t){return n(t,function(t,i){this._saved[i]=this[i],this[i]=t},this),this},transition:function(t,i){return n(t,function(t,e){this[e]=(t-this._saved[e])*i+this._saved[e]},this),this},tooltipPosition:function(){return{x:this.x,y:this.y}},hasValue:function(){return f(this.value)}}),e.Element.extend=r,e.Point=e.Element.extend({display:!0,inRange:function(t,i){var e=this.hitDetectionRadius+this.radius;return Math.pow(t-this.x,2)+Math.pow(i-this.y,2)<Math.pow(e,2)},draw:function(){if(this.display){var t=this.ctx;t.beginPath(),t.arc(this.x,this.y,this.radius,0,2*Math.PI),t.closePath(),t.strokeStyle=this.strokeColor,t.lineWidth=this.strokeWidth,t.fillStyle=this.fillColor,t.fill(),t.stroke()}}}),e.Arc=e.Element.extend({inRange:function(t,i){var e=s.getAngleFromPoint(this,{x:t,y:i}),n=e.angle>=this.startAngle&&e.angle<=this.endAngle,o=e.distance>=this.innerRadius&&e.distance<=this.outerRadius;return n&&o},tooltipPosition:function(){var t=this.startAngle+(this.endAngle-this.startAngle)/2,i=(this.outerRadius-this.innerRadius)/2+this.innerRadius;return{x:this.x+Math.cos(t)*i,y:this.y+Math.sin(t)*i}},draw:function(t){var i=this.ctx;i.beginPath(),i.arc(this.x,this.y,this.outerRadius,this.startAngle,this.endAngle),i.arc(this.x,this.y,this.innerRadius,this.endAngle,this.startAngle,!0),i.closePath(),i.strokeStyle=this.strokeColor,i.lineWidth=this.strokeWidth,i.fillStyle=this.fillColor,i.fill(),i.lineJoin="bevel",this.showStroke&&i.stroke()}}),e.Rectangle=e.Element.extend({draw:function(){var t=this.ctx,i=this.width/2,e=this.x-i,s=this.x+i,n=this.base-(this.base-this.y),o=this.strokeWidth/2;this.showStroke&&(e+=o,s-=o,n+=o),t.beginPath(),t.fillStyle=this.fillColor,t.strokeStyle=this.strokeColor,t.lineWidth=this.strokeWidth,t.moveTo(e,this.base),t.lineTo(e,n),t.lineTo(s,n),t.lineTo(s,this.base),t.fill(),this.showStroke&&t.stroke()},height:function(){return this.base-this.y},inRange:function(t,i){return t>=this.x-this.width/2&&t<=this.x+this.width/2&&i>=this.y&&i<=this.base}}),e.Tooltip=e.Element.extend({draw:function(){var t=this.chart.ctx;t.font=M(this.fontSize,this.fontStyle,this.fontFamily),this.xAlign="center",this.yAlign="above";var i=2,e=t.measureText(this.text).width+2*this.xPadding,s=this.fontSize+2*this.yPadding,n=s+this.caretHeight+i;this.x+e/2>this.chart.width?this.xAlign="left":this.x-e/2<0&&(this.xAlign="right"),this.y-n<0&&(this.yAlign="below");var o=this.x-e/2,a=this.y-n;switch(t.fillStyle=this.fillColor,this.yAlign){case"above":t.beginPath(),t.moveTo(this.x,this.y-i),t.lineTo(this.x+this.caretHeight,this.y-(i+this.caretHeight)),t.lineTo(this.x-this.caretHeight,this.y-(i+this.caretHeight)),t.closePath(),t.fill();break;case"below":a=this.y+i+this.caretHeight,t.beginPath(),t.moveTo(this.x,this.y+i),t.lineTo(this.x+this.caretHeight,this.y+i+this.caretHeight),t.lineTo(this.x-this.caretHeight,this.y+i+this.caretHeight),t.closePath(),t.fill()}switch(this.xAlign){case"left":o=this.x-e+(this.cornerRadius+this.caretHeight);break;case"right":o=this.x-(this.cornerRadius+this.caretHeight)}z(t,o,a,e,s,this.cornerRadius),t.fill(),t.fillStyle=this.textColor,t.textAlign="center",t.textBaseline="middle",t.fillText(this.text,o+e/2,a+s/2)}}),e.MultiTooltip=e.Element.extend({initialize:function(){this.font=M(this.fontSize,this.fontStyle,this.fontFamily),this.titleFont=M(this.titleFontSize,this.titleFontStyle,this.titleFontFamily),this.height=this.labels.length*this.fontSize+(this.labels.length-1)*(this.fontSize/2)+2*this.yPadding+1.5*this.titleFontSize,this.ctx.font=this.titleFont;var t=this.ctx.measureText(this.title).width,i=W(this.ctx,this.font,this.labels)+this.fontSize+3,e=g([i,t]);this.width=e+2*this.xPadding;var s=this.height/2;this.y-s<0?this.y=s:this.y+s>this.chart.height&&(this.y=this.chart.height-s),this.x>this.chart.width/2?this.x-=this.xOffset+this.width:this.x+=this.xOffset},getLineHeight:function(t){var i=this.y-this.height/2+this.yPadding,e=t-1;return 0===t?i+this.titleFontSize/2:i+(1.5*this.fontSize*e+this.fontSize/2)+1.5*this.titleFontSize},draw:function(){z(this.ctx,this.x,this.y-this.height/2,this.width,this.height,this.cornerRadius);var t=this.ctx;t.fillStyle=this.fillColor,t.fill(),t.closePath(),t.textAlign="left",t.textBaseline="middle",t.fillStyle=this.titleTextColor,t.font=this.titleFont,t.fillText(this.title,this.x+this.xPadding,this.getLineHeight(0)),t.font=this.font,s.each(this.labels,function(i,e){t.fillStyle=this.textColor,t.fillText(i,this.x+this.xPadding+this.fontSize+3,this.getLineHeight(e+1)),t.fillStyle=this.legendColorBackground,t.fillRect(this.x+this.xPadding,this.getLineHeight(e+1)-this.fontSize/2,this.fontSize,this.fontSize),t.fillStyle=this.legendColors[e].fill,t.fillRect(this.x+this.xPadding,this.getLineHeight(e+1)-this.fontSize/2,this.fontSize,this.fontSize)},this)}}),e.Scale=e.Element.extend({initialize:function(){this.fit()},buildYLabels:function(){this.yLabels=[];for(var t=v(this.stepValue),i=0;i<=this.steps;i++)this.yLabels.push(C(this.templateString,{value:(this.min+i*this.stepValue).toFixed(t)}));this.yLabelWidth=this.display&&this.showLabels?W(this.ctx,this.font,this.yLabels):0},addXLabel:function(t){this.xLabels.push(t),this.valuesCount++,this.fit()},removeXLabel:function(){this.xLabels.shift(),this.valuesCount--,this.fit()},fit:function(){this.startPoint=this.display?this.fontSize:0,this.endPoint=this.display?this.height-1.5*this.fontSize-5:this.height,this.startPoint+=this.padding,this.endPoint-=this.padding;var t,i=this.endPoint-this.startPoint;for(this.calculateYRange(i),this.buildYLabels(),this.calculateXLabelRotation();i>this.endPoint-this.startPoint;)i=this.endPoint-this.startPoint,t=this.yLabelWidth,this.calculateYRange(i),this.buildYLabels(),t<this.yLabelWidth&&this.calculateXLabelRotation()},calculateXLabelRotation:function(){this.ctx.font=this.font;var t,i,e=this.ctx.measureText(this.xLabels[0]).width,s=this.ctx.measureText(this.xLabels[this.xLabels.length-1]).width;if(this.xScalePaddingRight=s/2+3,this.xScalePaddingLeft=e/2>this.yLabelWidth+10?e/2:this.yLabelWidth+10,this.xLabelRotation=0,this.display){var n,o=W(this.ctx,this.font,this.xLabels);this.xLabelWidth=o;for(var a=Math.floor(this.calculateX(1)-this.calculateX(0))-6;this.xLabelWidth>a&&0===this.xLabelRotation||this.xLabelWidth>a&&this.xLabelRotation<=90&&this.xLabelRotation>0;)n=Math.cos(x(this.xLabelRotation)),t=n*e,i=n*s,t+this.fontSize/2>this.yLabelWidth+8&&(this.xScalePaddingLeft=t+this.fontSize/2),this.xScalePaddingRight=this.fontSize/2,this.xLabelRotation++,this.xLabelWidth=n*o;this.xLabelRotation>0&&(this.endPoint-=Math.sin(x(this.xLabelRotation))*o+3)}else this.xLabelWidth=0,this.xScalePaddingRight=this.padding,this.xScalePaddingLeft=this.padding},calculateYRange:c,drawingArea:function(){return this.startPoint-this.endPoint},calculateY:function(t){var i=this.drawingArea()/(this.min-this.max);return this.endPoint-i*(t-this.min)},calculateX:function(t){var i=(this.xLabelRotation>0,this.width-(this.xScalePaddingLeft+this.xScalePaddingRight)),e=i/(this.valuesCount-(this.offsetGridLines?0:1)),s=e*t+this.xScalePaddingLeft;return this.offsetGridLines&&(s+=e/2),Math.round(s)},update:function(t){s.extend(this,t),this.fit()},draw:function(){var t=this.ctx,i=(this.endPoint-this.startPoint)/this.steps,e=Math.round(this.xScalePaddingLeft);this.display&&(t.fillStyle=this.textColor,t.font=this.font,n(this.yLabels,function(n,o){var a=this.endPoint-i*o,h=Math.round(a);t.textAlign="right",t.textBaseline="middle",this.showLabels&&t.fillText(n,e-10,a),t.beginPath(),o>0?(t.lineWidth=this.gridLineWidth,t.strokeStyle=this.gridLineColor):(t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor),h+=s.aliasPixel(t.lineWidth),t.moveTo(e,h),t.lineTo(this.width,h),t.stroke(),t.closePath(),t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor,t.beginPath(),t.moveTo(e-5,h),t.lineTo(e,h),t.stroke(),t.closePath()},this),n(this.xLabels,function(i,e){var s=this.calculateX(e)+S(this.lineWidth),n=this.calculateX(e-(this.offsetGridLines?.5:0))+S(this.lineWidth),o=this.xLabelRotation>0;t.beginPath(),e>0?(t.lineWidth=this.gridLineWidth,t.strokeStyle=this.gridLineColor):(t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor),t.moveTo(n,this.endPoint),t.lineTo(n,this.startPoint-3),t.stroke(),t.closePath(),t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor,t.beginPath(),t.moveTo(n,this.endPoint),t.lineTo(n,this.endPoint+5),t.stroke(),t.closePath(),t.save(),t.translate(s,o?this.endPoint+12:this.endPoint+8),t.rotate(-1*x(this.xLabelRotation)),t.font=this.font,t.textAlign=o?"right":"center",t.textBaseline=o?"middle":"top",t.fillText(i,0,0),t.restore()},this))}}),e.RadialScale=e.Element.extend({initialize:function(){this.size=m([this.height,this.width]),this.drawingArea=this.display?this.size/2-(this.fontSize/2+this.backdropPaddingY):this.size/2},calculateCenterOffset:function(t){var i=this.drawingArea/(this.max-this.min);return(t-this.min)*i},update:function(){this.lineArc?this.drawingArea=this.display?this.size/2-(this.fontSize/2+this.backdropPaddingY):this.size/2:this.setScaleSize(),this.buildYLabels()},buildYLabels:function(){this.yLabels=[];for(var t=v(this.stepValue),i=0;i<=this.steps;i++)this.yLabels.push(C(this.templateString,{value:(this.min+i*this.stepValue).toFixed(t)}))},getCircumference:function(){return 2*Math.PI/this.valuesCount},setScaleSize:function(){var t,i,e,s,n,o,a,h,l,r,c,u,d=m([this.height/2-this.pointLabelFontSize-5,this.width/2]),p=this.width,g=0;for(this.ctx.font=M(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily),i=0;i<this.valuesCount;i++)t=this.getPointPosition(i,d),e=this.ctx.measureText(C(this.templateString,{value:this.labels[i]})).width+5,0===i||i===this.valuesCount/2?(s=e/2,t.x+s>p&&(p=t.x+s,n=i),t.x-s<g&&(g=t.x-s,a=i)):i<this.valuesCount/2?t.x+e>p&&(p=t.x+e,n=i):i>this.valuesCount/2&&t.x-e<g&&(g=t.x-e,a=i);l=g,r=Math.ceil(p-this.width),o=this.getIndexAngle(n),h=this.getIndexAngle(a),c=r/Math.sin(o+Math.PI/2),u=l/Math.sin(h+Math.PI/2),c=f(c)?c:0,u=f(u)?u:0,this.drawingArea=d-(u+c)/2,this.setCenterPoint(u,c)},setCenterPoint:function(t,i){var e=this.width-i-this.drawingArea,s=t+this.drawingArea;this.xCenter=(s+e)/2,this.yCenter=this.height/2},getIndexAngle:function(t){var i=2*Math.PI/this.valuesCount;return t*i-Math.PI/2},getPointPosition:function(t,i){var e=this.getIndexAngle(t);return{x:Math.cos(e)*i+this.xCenter,y:Math.sin(e)*i+this.yCenter}},draw:function(){if(this.display){var t=this.ctx;if(n(this.yLabels,function(i,e){if(e>0){var s,n=e*(this.drawingArea/this.steps),o=this.yCenter-n;if(this.lineWidth>0)if(t.strokeStyle=this.lineColor,t.lineWidth=this.lineWidth,this.lineArc)t.beginPath(),t.arc(this.xCenter,this.yCenter,n,0,2*Math.PI),t.closePath(),t.stroke();else{t.beginPath();for(var a=0;a<this.valuesCount;a++)s=this.getPointPosition(a,this.calculateCenterOffset(this.min+e*this.stepValue)),0===a?t.moveTo(s.x,s.y):t.lineTo(s.x,s.y);t.closePath(),t.stroke()}if(this.showLabels){if(t.font=M(this.fontSize,this.fontStyle,this.fontFamily),this.showLabelBackdrop){var h=t.measureText(i).width;t.fillStyle=this.backdropColor,t.fillRect(this.xCenter-h/2-this.backdropPaddingX,o-this.fontSize/2-this.backdropPaddingY,h+2*this.backdropPaddingX,this.fontSize+2*this.backdropPaddingY)}t.textAlign="center",t.textBaseline="middle",t.fillStyle=this.fontColor,t.fillText(i,this.xCenter,o)}}},this),!this.lineArc){t.lineWidth=this.angleLineWidth,t.strokeStyle=this.angleLineColor;for(var i=this.valuesCount-1;i>=0;i--){if(this.angleLineWidth>0){var e=this.getPointPosition(i,this.calculateCenterOffset(this.max));t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(e.x,e.y),t.stroke(),t.closePath()}var s=this.getPointPosition(i,this.calculateCenterOffset(this.max)+5);t.font=M(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily),t.fillStyle=this.pointLabelFontColor;var o=this.labels.length,a=this.labels.length/2,h=a/2,l=h>i||i>o-h,r=i===h||i===o-h;t.textAlign=0===i?"center":i===a?"center":a>i?"left":"right",t.textBaseline=r?"middle":l?"bottom":"top",t.fillText(this.labels[i],s.x,s.y)}}}}}),s.addEvent(window,"resize",function(){var t;return function(){clearTimeout(t),t=setTimeout(function(){n(e.instances,function(t){t.options.responsive&&t.resize(t.render,!0)})},50)}}()),p?define(function(){return e}):"object"==typeof module&&module.exports&&(module.exports=e),t.Chart=e,e.noConflict=function(){return t.Chart=i,e}}).call(this),function(){"use strict";var t=this,i=t.Chart,e=i.helpers,s={scaleBeginAtZero:!0,scaleShowGridLines:!0,scaleGridLineColor:"rgba(0,0,0,.05)",scaleGridLineWidth:1,barShowStroke:!0,barStrokeWidth:2,barValueSpacing:5,barDatasetSpacing:1,legendTemplate:'<ul class="<%=name.toLowerCase()%>-legend"><% for (var i=0; i<datasets.length; i++){%><li><span style="background-color:<%=datasets[i].fillColor%>"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>'};i.Type.extend({name:"Bar",defaults:s,initialize:function(t){var s=this.options;this.ScaleClass=i.Scale.extend({offsetGridLines:!0,calculateBarX:function(t,i,e){var n=this.calculateBaseWidth(),o=this.calculateX(e)-n/2,a=this.calculateBarWidth(t);return o+a*i+i*s.barDatasetSpacing+a/2},calculateBaseWidth:function(){return this.calculateX(1)-this.calculateX(0)-2*s.barValueSpacing},calculateBarWidth:function(t){var i=this.calculateBaseWidth()-(t-1)*s.barDatasetSpacing;return i/t}}),this.datasets=[],this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getBarsAtEvent(t):[];this.eachBars(function(t){t.restore(["fillColor","strokeColor"])}),e.each(i,function(t){t.fillColor=t.highlightFill,t.strokeColor=t.highlightStroke}),this.showTooltip(i)}),this.BarClass=i.Rectangle.extend({strokeWidth:this.options.barStrokeWidth,showStroke:this.options.barShowStroke,ctx:this.chart.ctx}),e.each(t.datasets,function(i){var s={label:i.label||null,fillColor:i.fillColor,strokeColor:i.strokeColor,bars:[]};this.datasets.push(s),e.each(i.data,function(e,n){s.bars.push(new this.BarClass({value:e,label:t.labels[n],datasetLabel:i.label,strokeColor:i.strokeColor,fillColor:i.fillColor,highlightFill:i.highlightFill||i.fillColor,highlightStroke:i.highlightStroke||i.strokeColor}))},this)},this),this.buildScale(t.labels),this.BarClass.prototype.base=this.scale.endPoint,this.eachBars(function(t,i,s){e.extend(t,{width:this.scale.calculateBarWidth(this.datasets.length),x:this.scale.calculateBarX(this.datasets.length,s,i),y:this.scale.endPoint}),t.save()},this),this.render()},update:function(){this.scale.update(),e.each(this.activeElements,function(t){t.restore(["fillColor","strokeColor"])}),this.eachBars(function(t){t.save()}),this.render()},eachBars:function(t){e.each(this.datasets,function(i,s){e.each(i.bars,t,this,s)},this)},getBarsAtEvent:function(t){for(var i,s=[],n=e.getRelativePosition(t),o=function(t){s.push(t.bars[i])},a=0;a<this.datasets.length;a++)for(i=0;i<this.datasets[a].bars.length;i++)if(this.datasets[a].bars[i].inRange(n.x,n.y))return e.each(this.datasets,o),s;return s},buildScale:function(t){var i=this,s=function(){var t=[];return i.eachBars(function(i){t.push(i.value)}),t},n={templateString:this.options.scaleLabel,height:this.chart.height,width:this.chart.width,ctx:this.chart.ctx,textColor:this.options.scaleFontColor,fontSize:this.options.scaleFontSize,fontStyle:this.options.scaleFontStyle,fontFamily:this.options.scaleFontFamily,valuesCount:t.length,beginAtZero:this.options.scaleBeginAtZero,integersOnly:this.options.scaleIntegersOnly,calculateYRange:function(t){var i=e.calculateScaleRange(s(),t,this.fontSize,this.beginAtZero,this.integersOnly);e.extend(this,i)},xLabels:t,font:e.fontString(this.options.scaleFontSize,this.options.scaleFontStyle,this.options.scaleFontFamily),lineWidth:this.options.scaleLineWidth,lineColor:this.options.scaleLineColor,gridLineWidth:this.options.scaleShowGridLines?this.options.scaleGridLineWidth:0,gridLineColor:this.options.scaleShowGridLines?this.options.scaleGridLineColor:"rgba(0,0,0,0)",padding:this.options.showScale?0:this.options.barShowStroke?this.options.barStrokeWidth:0,showLabels:this.options.scaleShowLabels,display:this.options.showScale};this.options.scaleOverride&&e.extend(n,{calculateYRange:e.noop,steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}),this.scale=new this.ScaleClass(n)},addData:function(t,i){e.each(t,function(t,e){this.datasets[e].bars.push(new this.BarClass({value:t,label:i,x:this.scale.calculateBarX(this.datasets.length,e,this.scale.valuesCount+1),y:this.scale.endPoint,width:this.scale.calculateBarWidth(this.datasets.length),base:this.scale.endPoint,strokeColor:this.datasets[e].strokeColor,fillColor:this.datasets[e].fillColor}))},this),this.scale.addXLabel(i),this.update()},removeData:function(){this.scale.removeXLabel(),e.each(this.datasets,function(t){t.bars.shift()},this),this.update()},reflow:function(){e.extend(this.BarClass.prototype,{y:this.scale.endPoint,base:this.scale.endPoint});var t=e.extend({height:this.chart.height,width:this.chart.width});this.scale.update(t)},draw:function(t){var i=t||1;this.clear();this.chart.ctx;this.scale.draw(i),e.each(this.datasets,function(t,s){e.each(t.bars,function(t,e){t.hasValue()&&(t.base=this.scale.endPoint,t.transition({x:this.scale.calculateBarX(this.datasets.length,s,e),y:this.scale.calculateY(t.value),width:this.scale.calculateBarWidth(this.datasets.length)},i).draw())},this)},this)}})}.call(this),function(){"use strict";var t=this,i=t.Chart,e=i.helpers,s={segmentShowStroke:!0,segmentStrokeColor:"#fff",segmentStrokeWidth:2,percentageInnerCutout:50,animationSteps:100,animationEasing:"easeOutBounce",animateRotate:!0,animateScale:!1,legendTemplate:'<ul class="<%=name.toLowerCase()%>-legend"><% for (var i=0; i<segments.length; i++){%><li><span style="background-color:<%=segments[i].fillColor%>"></span><%if(segments[i].label){%><%=segments[i].label%><%}%></li><%}%></ul>'};
|
11 |
+
i.Type.extend({name:"Doughnut",defaults:s,initialize:function(t){this.segments=[],this.outerRadius=(e.min([this.chart.width,this.chart.height])-this.options.segmentStrokeWidth/2)/2,this.SegmentArc=i.Arc.extend({ctx:this.chart.ctx,x:this.chart.width/2,y:this.chart.height/2}),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getSegmentsAtEvent(t):[];e.each(this.segments,function(t){t.restore(["fillColor"])}),e.each(i,function(t){t.fillColor=t.highlightColor}),this.showTooltip(i)}),this.calculateTotal(t),e.each(t,function(t,i){this.addData(t,i,!0)},this),this.render()},getSegmentsAtEvent:function(t){var i=[],s=e.getRelativePosition(t);return e.each(this.segments,function(t){t.inRange(s.x,s.y)&&i.push(t)},this),i},addData:function(t,i,e){var s=i||this.segments.length;this.segments.splice(s,0,new this.SegmentArc({value:t.value,outerRadius:this.options.animateScale?0:this.outerRadius,innerRadius:this.options.animateScale?0:this.outerRadius/100*this.options.percentageInnerCutout,fillColor:t.color,highlightColor:t.highlight||t.color,showStroke:this.options.segmentShowStroke,strokeWidth:this.options.segmentStrokeWidth,strokeColor:this.options.segmentStrokeColor,startAngle:1.5*Math.PI,circumference:this.options.animateRotate?0:this.calculateCircumference(t.value),label:t.label})),e||(this.reflow(),this.update())},calculateCircumference:function(t){return 2*Math.PI*(t/this.total)},calculateTotal:function(t){this.total=0,e.each(t,function(t){this.total+=t.value},this)},update:function(){this.calculateTotal(this.segments),e.each(this.activeElements,function(t){t.restore(["fillColor"])}),e.each(this.segments,function(t){t.save()}),this.render()},removeData:function(t){var i=e.isNumber(t)?t:this.segments.length-1;this.segments.splice(i,1),this.reflow(),this.update()},reflow:function(){e.extend(this.SegmentArc.prototype,{x:this.chart.width/2,y:this.chart.height/2}),this.outerRadius=(e.min([this.chart.width,this.chart.height])-this.options.segmentStrokeWidth/2)/2,e.each(this.segments,function(t){t.update({outerRadius:this.outerRadius,innerRadius:this.outerRadius/100*this.options.percentageInnerCutout})},this)},draw:function(t){var i=t?t:1;this.clear(),e.each(this.segments,function(t,e){t.transition({circumference:this.calculateCircumference(t.value),outerRadius:this.outerRadius,innerRadius:this.outerRadius/100*this.options.percentageInnerCutout},i),t.endAngle=t.startAngle+t.circumference,t.draw(),0===e&&(t.startAngle=1.5*Math.PI),e<this.segments.length-1&&(this.segments[e+1].startAngle=t.endAngle)},this)}}),i.types.Doughnut.extend({name:"Pie",defaults:e.merge(s,{percentageInnerCutout:0})})}.call(this),function(){"use strict";var t=this,i=t.Chart,e=i.helpers,s={scaleShowGridLines:!0,scaleGridLineColor:"rgba(0,0,0,.05)",scaleGridLineWidth:1,bezierCurve:!0,bezierCurveTension:.4,pointDot:!0,pointDotRadius:4,pointDotStrokeWidth:1,pointHitDetectionRadius:20,datasetStroke:!0,datasetStrokeWidth:2,datasetFill:!0,legendTemplate:'<ul class="<%=name.toLowerCase()%>-legend"><% for (var i=0; i<datasets.length; i++){%><li><span style="background-color:<%=datasets[i].strokeColor%>"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>'};i.Type.extend({name:"Line",defaults:s,initialize:function(t){this.PointClass=i.Point.extend({strokeWidth:this.options.pointDotStrokeWidth,radius:this.options.pointDotRadius,display:this.options.pointDot,hitDetectionRadius:this.options.pointHitDetectionRadius,ctx:this.chart.ctx,inRange:function(t){return Math.pow(t-this.x,2)<Math.pow(this.radius+this.hitDetectionRadius,2)}}),this.datasets=[],this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getPointsAtEvent(t):[];this.eachPoints(function(t){t.restore(["fillColor","strokeColor"])}),e.each(i,function(t){t.fillColor=t.highlightFill,t.strokeColor=t.highlightStroke}),this.showTooltip(i)}),e.each(t.datasets,function(i){var s={label:i.label||null,fillColor:i.fillColor,strokeColor:i.strokeColor,pointColor:i.pointColor,pointStrokeColor:i.pointStrokeColor,points:[]};this.datasets.push(s),e.each(i.data,function(e,n){s.points.push(new this.PointClass({value:e,label:t.labels[n],datasetLabel:i.label,strokeColor:i.pointStrokeColor,fillColor:i.pointColor,highlightFill:i.pointHighlightFill||i.pointColor,highlightStroke:i.pointHighlightStroke||i.pointStrokeColor}))},this),this.buildScale(t.labels),this.eachPoints(function(t,i){e.extend(t,{x:this.scale.calculateX(i),y:this.scale.endPoint}),t.save()},this)},this),this.render()},update:function(){this.scale.update(),e.each(this.activeElements,function(t){t.restore(["fillColor","strokeColor"])}),this.eachPoints(function(t){t.save()}),this.render()},eachPoints:function(t){e.each(this.datasets,function(i){e.each(i.points,t,this)},this)},getPointsAtEvent:function(t){var i=[],s=e.getRelativePosition(t);return e.each(this.datasets,function(t){e.each(t.points,function(t){t.inRange(s.x,s.y)&&i.push(t)})},this),i},buildScale:function(t){var s=this,n=function(){var t=[];return s.eachPoints(function(i){t.push(i.value)}),t},o={templateString:this.options.scaleLabel,height:this.chart.height,width:this.chart.width,ctx:this.chart.ctx,textColor:this.options.scaleFontColor,fontSize:this.options.scaleFontSize,fontStyle:this.options.scaleFontStyle,fontFamily:this.options.scaleFontFamily,valuesCount:t.length,beginAtZero:this.options.scaleBeginAtZero,integersOnly:this.options.scaleIntegersOnly,calculateYRange:function(t){var i=e.calculateScaleRange(n(),t,this.fontSize,this.beginAtZero,this.integersOnly);e.extend(this,i)},xLabels:t,font:e.fontString(this.options.scaleFontSize,this.options.scaleFontStyle,this.options.scaleFontFamily),lineWidth:this.options.scaleLineWidth,lineColor:this.options.scaleLineColor,gridLineWidth:this.options.scaleShowGridLines?this.options.scaleGridLineWidth:0,gridLineColor:this.options.scaleShowGridLines?this.options.scaleGridLineColor:"rgba(0,0,0,0)",padding:this.options.showScale?0:this.options.pointDotRadius+this.options.pointDotStrokeWidth,showLabels:this.options.scaleShowLabels,display:this.options.showScale};this.options.scaleOverride&&e.extend(o,{calculateYRange:e.noop,steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}),this.scale=new i.Scale(o)},addData:function(t,i){e.each(t,function(t,e){this.datasets[e].points.push(new this.PointClass({value:t,label:i,x:this.scale.calculateX(this.scale.valuesCount+1),y:this.scale.endPoint,strokeColor:this.datasets[e].pointStrokeColor,fillColor:this.datasets[e].pointColor}))},this),this.scale.addXLabel(i),this.update()},removeData:function(){this.scale.removeXLabel(),e.each(this.datasets,function(t){t.points.shift()},this),this.update()},reflow:function(){var t=e.extend({height:this.chart.height,width:this.chart.width});this.scale.update(t)},draw:function(t){var i=t||1;this.clear();var s=this.chart.ctx,n=function(t){return null!==t.value},o=function(t,i,s){return e.findNextWhere(i,n,s)||t},a=function(t,i,s){return e.findPreviousWhere(i,n,s)||t};this.scale.draw(i),e.each(this.datasets,function(t){var h=e.where(t.points,n);e.each(t.points,function(t,e){t.hasValue()&&t.transition({y:this.scale.calculateY(t.value),x:this.scale.calculateX(e)},i)},this),this.options.bezierCurve&&e.each(h,function(t,i){var s=i>0&&i<h.length-1?this.options.bezierCurveTension:0;t.controlPoints=e.splineCurve(a(t,h,i),t,o(t,h,i),s),t.controlPoints.outer.y>this.scale.endPoint?t.controlPoints.outer.y=this.scale.endPoint:t.controlPoints.outer.y<this.scale.startPoint&&(t.controlPoints.outer.y=this.scale.startPoint),t.controlPoints.inner.y>this.scale.endPoint?t.controlPoints.inner.y=this.scale.endPoint:t.controlPoints.inner.y<this.scale.startPoint&&(t.controlPoints.inner.y=this.scale.startPoint)},this),s.lineWidth=this.options.datasetStrokeWidth,s.strokeStyle=t.strokeColor,s.beginPath(),e.each(h,function(t,i){if(0===i)s.moveTo(t.x,t.y);else if(this.options.bezierCurve){var e=a(t,h,i);s.bezierCurveTo(e.controlPoints.outer.x,e.controlPoints.outer.y,t.controlPoints.inner.x,t.controlPoints.inner.y,t.x,t.y)}else s.lineTo(t.x,t.y)},this),s.stroke(),this.options.datasetFill&&h.length>0&&(s.lineTo(h[h.length-1].x,this.scale.endPoint),s.lineTo(h[0].x,this.scale.endPoint),s.fillStyle=t.fillColor,s.closePath(),s.fill()),e.each(h,function(t){t.draw()})},this)}})}.call(this),function(){"use strict";var t=this,i=t.Chart,e=i.helpers,s={scaleShowLabelBackdrop:!0,scaleBackdropColor:"rgba(255,255,255,0.75)",scaleBeginAtZero:!0,scaleBackdropPaddingY:2,scaleBackdropPaddingX:2,scaleShowLine:!0,segmentShowStroke:!0,segmentStrokeColor:"#fff",segmentStrokeWidth:2,animationSteps:100,animationEasing:"easeOutBounce",animateRotate:!0,animateScale:!1,legendTemplate:'<ul class="<%=name.toLowerCase()%>-legend"><% for (var i=0; i<segments.length; i++){%><li><span style="background-color:<%=segments[i].fillColor%>"></span><%if(segments[i].label){%><%=segments[i].label%><%}%></li><%}%></ul>'};i.Type.extend({name:"PolarArea",defaults:s,initialize:function(t){this.segments=[],this.SegmentArc=i.Arc.extend({showStroke:this.options.segmentShowStroke,strokeWidth:this.options.segmentStrokeWidth,strokeColor:this.options.segmentStrokeColor,ctx:this.chart.ctx,innerRadius:0,x:this.chart.width/2,y:this.chart.height/2}),this.scale=new i.RadialScale({display:this.options.showScale,fontStyle:this.options.scaleFontStyle,fontSize:this.options.scaleFontSize,fontFamily:this.options.scaleFontFamily,fontColor:this.options.scaleFontColor,showLabels:this.options.scaleShowLabels,showLabelBackdrop:this.options.scaleShowLabelBackdrop,backdropColor:this.options.scaleBackdropColor,backdropPaddingY:this.options.scaleBackdropPaddingY,backdropPaddingX:this.options.scaleBackdropPaddingX,lineWidth:this.options.scaleShowLine?this.options.scaleLineWidth:0,lineColor:this.options.scaleLineColor,lineArc:!0,width:this.chart.width,height:this.chart.height,xCenter:this.chart.width/2,yCenter:this.chart.height/2,ctx:this.chart.ctx,templateString:this.options.scaleLabel,valuesCount:t.length}),this.updateScaleRange(t),this.scale.update(),e.each(t,function(t,i){this.addData(t,i,!0)},this),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getSegmentsAtEvent(t):[];e.each(this.segments,function(t){t.restore(["fillColor"])}),e.each(i,function(t){t.fillColor=t.highlightColor}),this.showTooltip(i)}),this.render()},getSegmentsAtEvent:function(t){var i=[],s=e.getRelativePosition(t);return e.each(this.segments,function(t){t.inRange(s.x,s.y)&&i.push(t)},this),i},addData:function(t,i,e){var s=i||this.segments.length;this.segments.splice(s,0,new this.SegmentArc({fillColor:t.color,highlightColor:t.highlight||t.color,label:t.label,value:t.value,outerRadius:this.options.animateScale?0:this.scale.calculateCenterOffset(t.value),circumference:this.options.animateRotate?0:this.scale.getCircumference(),startAngle:1.5*Math.PI})),e||(this.reflow(),this.update())},removeData:function(t){var i=e.isNumber(t)?t:this.segments.length-1;this.segments.splice(i,1),this.reflow(),this.update()},calculateTotal:function(t){this.total=0,e.each(t,function(t){this.total+=t.value},this),this.scale.valuesCount=this.segments.length},updateScaleRange:function(t){var i=[];e.each(t,function(t){i.push(t.value)});var s=this.options.scaleOverride?{steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}:e.calculateScaleRange(i,e.min([this.chart.width,this.chart.height])/2,this.options.scaleFontSize,this.options.scaleBeginAtZero,this.options.scaleIntegersOnly);e.extend(this.scale,s,{size:e.min([this.chart.width,this.chart.height]),xCenter:this.chart.width/2,yCenter:this.chart.height/2})},update:function(){this.calculateTotal(this.segments),e.each(this.segments,function(t){t.save()}),this.render()},reflow:function(){e.extend(this.SegmentArc.prototype,{x:this.chart.width/2,y:this.chart.height/2}),this.updateScaleRange(this.segments),this.scale.update(),e.extend(this.scale,{xCenter:this.chart.width/2,yCenter:this.chart.height/2}),e.each(this.segments,function(t){t.update({outerRadius:this.scale.calculateCenterOffset(t.value)})},this)},draw:function(t){var i=t||1;this.clear(),e.each(this.segments,function(t,e){t.transition({circumference:this.scale.getCircumference(),outerRadius:this.scale.calculateCenterOffset(t.value)},i),t.endAngle=t.startAngle+t.circumference,0===e&&(t.startAngle=1.5*Math.PI),e<this.segments.length-1&&(this.segments[e+1].startAngle=t.endAngle),t.draw()},this),this.scale.draw()}})}.call(this),function(){"use strict";var t=this,i=t.Chart,e=i.helpers;i.Type.extend({name:"Radar",defaults:{scaleShowLine:!0,angleShowLineOut:!0,scaleShowLabels:!1,scaleBeginAtZero:!0,angleLineColor:"rgba(0,0,0,.1)",angleLineWidth:1,pointLabelFontFamily:"'Arial'",pointLabelFontStyle:"normal",pointLabelFontSize:10,pointLabelFontColor:"#666",pointDot:!0,pointDotRadius:3,pointDotStrokeWidth:1,pointHitDetectionRadius:20,datasetStroke:!0,datasetStrokeWidth:2,datasetFill:!0,legendTemplate:'<ul class="<%=name.toLowerCase()%>-legend"><% for (var i=0; i<datasets.length; i++){%><li><span style="background-color:<%=datasets[i].strokeColor%>"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>'},initialize:function(t){this.PointClass=i.Point.extend({strokeWidth:this.options.pointDotStrokeWidth,radius:this.options.pointDotRadius,display:this.options.pointDot,hitDetectionRadius:this.options.pointHitDetectionRadius,ctx:this.chart.ctx}),this.datasets=[],this.buildScale(t),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getPointsAtEvent(t):[];this.eachPoints(function(t){t.restore(["fillColor","strokeColor"])}),e.each(i,function(t){t.fillColor=t.highlightFill,t.strokeColor=t.highlightStroke}),this.showTooltip(i)}),e.each(t.datasets,function(i){var s={label:i.label||null,fillColor:i.fillColor,strokeColor:i.strokeColor,pointColor:i.pointColor,pointStrokeColor:i.pointStrokeColor,points:[]};this.datasets.push(s),e.each(i.data,function(e,n){var o;this.scale.animation||(o=this.scale.getPointPosition(n,this.scale.calculateCenterOffset(e))),s.points.push(new this.PointClass({value:e,label:t.labels[n],datasetLabel:i.label,x:this.options.animation?this.scale.xCenter:o.x,y:this.options.animation?this.scale.yCenter:o.y,strokeColor:i.pointStrokeColor,fillColor:i.pointColor,highlightFill:i.pointHighlightFill||i.pointColor,highlightStroke:i.pointHighlightStroke||i.pointStrokeColor}))},this)},this),this.render()},eachPoints:function(t){e.each(this.datasets,function(i){e.each(i.points,t,this)},this)},getPointsAtEvent:function(t){var i=e.getRelativePosition(t),s=e.getAngleFromPoint({x:this.scale.xCenter,y:this.scale.yCenter},i),n=2*Math.PI/this.scale.valuesCount,o=Math.round((s.angle-1.5*Math.PI)/n),a=[];return(o>=this.scale.valuesCount||0>o)&&(o=0),s.distance<=this.scale.drawingArea&&e.each(this.datasets,function(t){a.push(t.points[o])}),a},buildScale:function(t){this.scale=new i.RadialScale({display:this.options.showScale,fontStyle:this.options.scaleFontStyle,fontSize:this.options.scaleFontSize,fontFamily:this.options.scaleFontFamily,fontColor:this.options.scaleFontColor,showLabels:this.options.scaleShowLabels,showLabelBackdrop:this.options.scaleShowLabelBackdrop,backdropColor:this.options.scaleBackdropColor,backdropPaddingY:this.options.scaleBackdropPaddingY,backdropPaddingX:this.options.scaleBackdropPaddingX,lineWidth:this.options.scaleShowLine?this.options.scaleLineWidth:0,lineColor:this.options.scaleLineColor,angleLineColor:this.options.angleLineColor,angleLineWidth:this.options.angleShowLineOut?this.options.angleLineWidth:0,pointLabelFontColor:this.options.pointLabelFontColor,pointLabelFontSize:this.options.pointLabelFontSize,pointLabelFontFamily:this.options.pointLabelFontFamily,pointLabelFontStyle:this.options.pointLabelFontStyle,height:this.chart.height,width:this.chart.width,xCenter:this.chart.width/2,yCenter:this.chart.height/2,ctx:this.chart.ctx,templateString:this.options.scaleLabel,labels:t.labels,valuesCount:t.datasets[0].data.length}),this.scale.setScaleSize(),this.updateScaleRange(t.datasets),this.scale.buildYLabels()},updateScaleRange:function(t){var i=function(){var i=[];return e.each(t,function(t){t.data?i=i.concat(t.data):e.each(t.points,function(t){i.push(t.value)})}),i}(),s=this.options.scaleOverride?{steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}:e.calculateScaleRange(i,e.min([this.chart.width,this.chart.height])/2,this.options.scaleFontSize,this.options.scaleBeginAtZero,this.options.scaleIntegersOnly);e.extend(this.scale,s)},addData:function(t,i){this.scale.valuesCount++,e.each(t,function(t,e){var s=this.scale.getPointPosition(this.scale.valuesCount,this.scale.calculateCenterOffset(t));this.datasets[e].points.push(new this.PointClass({value:t,label:i,x:s.x,y:s.y,strokeColor:this.datasets[e].pointStrokeColor,fillColor:this.datasets[e].pointColor}))},this),this.scale.labels.push(i),this.reflow(),this.update()},removeData:function(){this.scale.valuesCount--,this.scale.labels.shift(),e.each(this.datasets,function(t){t.points.shift()},this),this.reflow(),this.update()},update:function(){this.eachPoints(function(t){t.save()}),this.reflow(),this.render()},reflow:function(){e.extend(this.scale,{width:this.chart.width,height:this.chart.height,size:e.min([this.chart.width,this.chart.height]),xCenter:this.chart.width/2,yCenter:this.chart.height/2}),this.updateScaleRange(this.datasets),this.scale.setScaleSize(),this.scale.buildYLabels()},draw:function(t){var i=t||1,s=this.chart.ctx;this.clear(),this.scale.draw(),e.each(this.datasets,function(t){e.each(t.points,function(t,e){t.hasValue()&&t.transition(this.scale.getPointPosition(e,this.scale.calculateCenterOffset(t.value)),i)},this),s.lineWidth=this.options.datasetStrokeWidth,s.strokeStyle=t.strokeColor,s.beginPath(),e.each(t.points,function(t,i){0===i?s.moveTo(t.x,t.y):s.lineTo(t.x,t.y)},this),s.closePath(),s.stroke(),s.fillStyle=t.fillColor,s.fill(),e.each(t.points,function(t){t.hasValue()&&t.draw()})},this)}})}.call(this);
|
lib/Chart_js/LICENSE.md
ADDED
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
Copyright (c) 2013-2014 Nick Downie
|
2 |
+
|
3 |
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
4 |
+
|
5 |
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
6 |
+
|
7 |
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
lib/Chart_js/README.md
ADDED
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Chart.js
|
2 |
+
|
3 |
+
[![Code Climate](https://codeclimate.com/github/nnnick/Chart.js/badges/gpa.svg)](https://codeclimate.com/github/nnnick/Chart.js)
|
4 |
+
|
5 |
+
|
6 |
+
*Simple HTML5 Charts using the canvas element* [chartjs.org](http://www.chartjs.org)
|
7 |
+
|
8 |
+
## Documentation
|
9 |
+
|
10 |
+
You can find documentation at [chartjs.org/docs](http://www.chartjs.org/docs/). The markdown files that build the site are available under `/docs`. Please note - in some of the json examples of configuration you might notice some liquid tags - this is just for the generating the site html, please disregard.
|
11 |
+
|
12 |
+
## License
|
13 |
+
|
14 |
+
Chart.js is available under the [MIT license](http://opensource.org/licenses/MIT).
|
15 |
+
|
16 |
+
## Bugs & issues
|
17 |
+
|
18 |
+
When reporting bugs or issues, if you could include a link to a simple [jsbin](http://jsbin.com) or similar demonstrating the issue, that'd be really helpful.
|
19 |
+
|
20 |
+
This project is modular and supports separately-maintained new chart types. This project's scope includes only the chart types included. New chart types should be created and maintained in separate repositories. We may consider linking to them from this project if they incude passing build tests and have complete documentation. Please discuss new or "missing" chart types in the [Chart.js User Discussion](https://groups.google.com/forum/#!forum/chartjs-user-discussion) Google Group and not in Issues. For more information, please also see the CONTRIBUTING file.
|
lib/Chart_js/bower.json
ADDED
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"name": "Chart.js",
|
3 |
+
"version": "1.0.1-beta.4",
|
4 |
+
"description": "Simple HTML5 Charts using the canvas element",
|
5 |
+
"homepage": "https://github.com/nnnick/Chart.js",
|
6 |
+
"author": "nnnick",
|
7 |
+
"main": [
|
8 |
+
"Chart.min.js"
|
9 |
+
],
|
10 |
+
"dependencies": {}
|
11 |
+
}
|
lib/Chart_js/docs/00-Getting-Started.md
ADDED
@@ -0,0 +1,200 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
---
|
2 |
+
title: Getting started
|
3 |
+
anchor: getting-started
|
4 |
+
---
|
5 |
+
|
6 |
+
###Include Chart.js
|
7 |
+
|
8 |
+
First we need to include the Chart.js library on the page. The library occupies a global variable of `Chart`.
|
9 |
+
|
10 |
+
```html
|
11 |
+
<script src="Chart.js"></script>
|
12 |
+
```
|
13 |
+
|
14 |
+
Alternatively, if you're using an AMD loader for JavaScript modules, that is also supported in the Chart.js core. Please note: the library will still occupy a global variable of `Chart`, even if it detects `define` and `define.amd`. If this is a problem, you can call `noConflict` to restore the global Chart variable to it's previous owner.
|
15 |
+
|
16 |
+
```javascript
|
17 |
+
// Using requirejs
|
18 |
+
require(['path/to/Chartjs'], function(Chart){
|
19 |
+
// Use Chart.js as normal here.
|
20 |
+
|
21 |
+
// Chart.noConflict restores the Chart global variable to it's previous owner
|
22 |
+
// The function returns what was previously Chart, allowing you to reassign.
|
23 |
+
var Chartjs = Chart.noConflict();
|
24 |
+
|
25 |
+
});
|
26 |
+
```
|
27 |
+
|
28 |
+
You can also grab Chart.js using bower:
|
29 |
+
|
30 |
+
```bash
|
31 |
+
bower install chartjs --save
|
32 |
+
```
|
33 |
+
|
34 |
+
###Creating a chart
|
35 |
+
|
36 |
+
To create a chart, we need to instantiate the `Chart` class. To do this, we need to pass in the 2d context of where we want to draw the chart. Here's an example.
|
37 |
+
|
38 |
+
```html
|
39 |
+
<canvas id="myChart" width="400" height="400"></canvas>
|
40 |
+
```
|
41 |
+
|
42 |
+
```javascript
|
43 |
+
// Get the context of the canvas element we want to select
|
44 |
+
var ctx = document.getElementById("myChart").getContext("2d");
|
45 |
+
var myNewChart = new Chart(ctx).PolarArea(data);
|
46 |
+
```
|
47 |
+
|
48 |
+
We can also get the context of our canvas with jQuery. To do this, we need to get the DOM node out of the jQuery collection, and call the `getContext("2d")` method on that.
|
49 |
+
|
50 |
+
```javascript
|
51 |
+
// Get context with jQuery - using jQuery's .get() method.
|
52 |
+
var ctx = $("#myChart").get(0).getContext("2d");
|
53 |
+
// This will get the first returned node in the jQuery collection.
|
54 |
+
var myNewChart = new Chart(ctx);
|
55 |
+
```
|
56 |
+
|
57 |
+
After we've instantiated the Chart class on the canvas we want to draw on, Chart.js will handle the scaling for retina displays.
|
58 |
+
|
59 |
+
With the Chart class set up, we can go on to create one of the charts Chart.js has available. In the example below, we would be drawing a Polar area chart.
|
60 |
+
|
61 |
+
```javascript
|
62 |
+
new Chart(ctx).PolarArea(data, options);
|
63 |
+
```
|
64 |
+
|
65 |
+
We call a method of the name of the chart we want to create. We pass in the data for that chart type, and the options for that chart as parameters. Chart.js will merge the global defaults with chart type specific defaults, then merge any options passed in as a second argument after data.
|
66 |
+
|
67 |
+
###Global chart configuration
|
68 |
+
|
69 |
+
This concept was introduced in Chart.js 1.0 to keep configuration DRY, and allow for changing options globally across chart types, avoiding the need to specify options for each instance, or the default for a particular chart type.
|
70 |
+
|
71 |
+
```javascript
|
72 |
+
Chart.defaults.global = {
|
73 |
+
// Boolean - Whether to animate the chart
|
74 |
+
animation: true,
|
75 |
+
|
76 |
+
// Number - Number of animation steps
|
77 |
+
animationSteps: 60,
|
78 |
+
|
79 |
+
// String - Animation easing effect
|
80 |
+
animationEasing: "easeOutQuart",
|
81 |
+
|
82 |
+
// Boolean - If we should show the scale at all
|
83 |
+
showScale: true,
|
84 |
+
|
85 |
+
// Boolean - If we want to override with a hard coded scale
|
86 |
+
scaleOverride: false,
|
87 |
+
|
88 |
+
// ** Required if scaleOverride is true **
|
89 |
+
// Number - The number of steps in a hard coded scale
|
90 |
+
scaleSteps: null,
|
91 |
+
// Number - The value jump in the hard coded scale
|
92 |
+
scaleStepWidth: null,
|
93 |
+
// Number - The scale starting value
|
94 |
+
scaleStartValue: null,
|
95 |
+
|
96 |
+
// String - Colour of the scale line
|
97 |
+
scaleLineColor: "rgba(0,0,0,.1)",
|
98 |
+
|
99 |
+
// Number - Pixel width of the scale line
|
100 |
+
scaleLineWidth: 1,
|
101 |
+
|
102 |
+
// Boolean - Whether to show labels on the scale
|
103 |
+
scaleShowLabels: true,
|
104 |
+
|
105 |
+
// Interpolated JS string - can access value
|
106 |
+
scaleLabel: "<%=value%>",
|
107 |
+
|
108 |
+
// Boolean - Whether the scale should stick to integers, not floats even if drawing space is there
|
109 |
+
scaleIntegersOnly: true,
|
110 |
+
|
111 |
+
// Boolean - Whether the scale should start at zero, or an order of magnitude down from the lowest value
|
112 |
+
scaleBeginAtZero: false,
|
113 |
+
|
114 |
+
// String - Scale label font declaration for the scale label
|
115 |
+
scaleFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",
|
116 |
+
|
117 |
+
// Number - Scale label font size in pixels
|
118 |
+
scaleFontSize: 12,
|
119 |
+
|
120 |
+
// String - Scale label font weight style
|
121 |
+
scaleFontStyle: "normal",
|
122 |
+
|
123 |
+
// String - Scale label font colour
|
124 |
+
scaleFontColor: "#666",
|
125 |
+
|
126 |
+
// Boolean - whether or not the chart should be responsive and resize when the browser does.
|
127 |
+
responsive: false,
|
128 |
+
|
129 |
+
// Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container
|
130 |
+
maintainAspectRatio: true,
|
131 |
+
|
132 |
+
// Boolean - Determines whether to draw tooltips on the canvas or not
|
133 |
+
showTooltips: true,
|
134 |
+
|
135 |
+
// Array - Array of string names to attach tooltip events
|
136 |
+
tooltipEvents: ["mousemove", "touchstart", "touchmove"],
|
137 |
+
|
138 |
+
// String - Tooltip background colour
|
139 |
+
tooltipFillColor: "rgba(0,0,0,0.8)",
|
140 |
+
|
141 |
+
// String - Tooltip label font declaration for the scale label
|
142 |
+
tooltipFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",
|
143 |
+
|
144 |
+
// Number - Tooltip label font size in pixels
|
145 |
+
tooltipFontSize: 14,
|
146 |
+
|
147 |
+
// String - Tooltip font weight style
|
148 |
+
tooltipFontStyle: "normal",
|
149 |
+
|
150 |
+
// String - Tooltip label font colour
|
151 |
+
tooltipFontColor: "#fff",
|
152 |
+
|
153 |
+
// String - Tooltip title font declaration for the scale label
|
154 |
+
tooltipTitleFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",
|
155 |
+
|
156 |
+
// Number - Tooltip title font size in pixels
|
157 |
+
tooltipTitleFontSize: 14,
|
158 |
+
|
159 |
+
// String - Tooltip title font weight style
|
160 |
+
tooltipTitleFontStyle: "bold",
|
161 |
+
|
162 |
+
// String - Tooltip title font colour
|
163 |
+
tooltipTitleFontColor: "#fff",
|
164 |
+
|
165 |
+
// Number - pixel width of padding around tooltip text
|
166 |
+
tooltipYPadding: 6,
|
167 |
+
|
168 |
+
// Number - pixel width of padding around tooltip text
|
169 |
+
tooltipXPadding: 6,
|
170 |
+
|
171 |
+
// Number - Size of the caret on the tooltip
|
172 |
+
tooltipCaretSize: 8,
|
173 |
+
|
174 |
+
// Number - Pixel radius of the tooltip border
|
175 |
+
tooltipCornerRadius: 6,
|
176 |
+
|
177 |
+
// Number - Pixel offset from point x to tooltip edge
|
178 |
+
tooltipXOffset: 10,
|
179 |
+
{% raw %}
|
180 |
+
// String - Template string for single tooltips
|
181 |
+
tooltipTemplate: "<%if (label){%><%=label%>: <%}%><%= value %>",
|
182 |
+
{% endraw %}
|
183 |
+
// String - Template string for single tooltips
|
184 |
+
multiTooltipTemplate: "<%= value %>",
|
185 |
+
|
186 |
+
// Function - Will fire on animation progression.
|
187 |
+
onAnimationProgress: function(){},
|
188 |
+
|
189 |
+
// Function - Will fire on animation completion.
|
190 |
+
onAnimationComplete: function(){}
|
191 |
+
}
|
192 |
+
```
|
193 |
+
|
194 |
+
If for example, you wanted all charts created to be responsive, and resize when the browser window does, the following setting can be changed:
|
195 |
+
|
196 |
+
```javascript
|
197 |
+
Chart.defaults.global.responsive = true;
|
198 |
+
```
|
199 |
+
|
200 |
+
Now, every time we create a chart, `options.responsive` will be `true`.
|
lib/Chart_js/docs/01-Line-Chart.md
ADDED
@@ -0,0 +1,160 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
---
|
2 |
+
title: Line Chart
|
3 |
+
anchor: line-chart
|
4 |
+
---
|
5 |
+
###Introduction
|
6 |
+
A line chart is a way of plotting data points on a line.
|
7 |
+
|
8 |
+
Often, it is used to show trend data, and the comparison of two data sets.
|
9 |
+
|
10 |
+
<div class="canvas-holder">
|
11 |
+
<canvas width="250" height="125"></canvas>
|
12 |
+
</div>
|
13 |
+
|
14 |
+
###Example usage
|
15 |
+
```javascript
|
16 |
+
var myLineChart = new Chart(ctx).Line(data, options);
|
17 |
+
```
|
18 |
+
###Data structure
|
19 |
+
|
20 |
+
```javascript
|
21 |
+
var data = {
|
22 |
+
labels: ["January", "February", "March", "April", "May", "June", "July"],
|
23 |
+
datasets: [
|
24 |
+
{
|
25 |
+
label: "My First dataset",
|
26 |
+
fillColor: "rgba(220,220,220,0.2)",
|
27 |
+
strokeColor: "rgba(220,220,220,1)",
|
28 |
+
pointColor: "rgba(220,220,220,1)",
|
29 |
+
pointStrokeColor: "#fff",
|
30 |
+
pointHighlightFill: "#fff",
|
31 |
+
pointHighlightStroke: "rgba(220,220,220,1)",
|
32 |
+
data: [65, 59, 80, 81, 56, 55, 40]
|
33 |
+
},
|
34 |
+
{
|
35 |
+
label: "My Second dataset",
|
36 |
+
fillColor: "rgba(151,187,205,0.2)",
|
37 |
+
strokeColor: "rgba(151,187,205,1)",
|
38 |
+
pointColor: "rgba(151,187,205,1)",
|
39 |
+
pointStrokeColor: "#fff",
|
40 |
+
pointHighlightFill: "#fff",
|
41 |
+
pointHighlightStroke: "rgba(151,187,205,1)",
|
42 |
+
data: [28, 48, 40, 19, 86, 27, 90]
|
43 |
+
}
|
44 |
+
]
|
45 |
+
};
|
46 |
+
```
|
47 |
+
|
48 |
+
The line chart requires an array of labels for each of the data points. This is shown on the X axis.
|
49 |
+
The data for line charts is broken up into an array of datasets. Each dataset has a colour for the fill, a colour for the line and colours for the points and strokes of the points. These colours are strings just like CSS. You can use RGBA, RGB, HEX or HSL notation.
|
50 |
+
|
51 |
+
The label key on each dataset is optional, and can be used when generating a scale for the chart.
|
52 |
+
|
53 |
+
### Chart options
|
54 |
+
|
55 |
+
These are the customisation options specific to Line charts. These options are merged with the [global chart configuration options](#getting-started-global-chart-configuration), and form the options of the chart.
|
56 |
+
|
57 |
+
```javascript
|
58 |
+
{
|
59 |
+
|
60 |
+
///Boolean - Whether grid lines are shown across the chart
|
61 |
+
scaleShowGridLines : true,
|
62 |
+
|
63 |
+
//String - Colour of the grid lines
|
64 |
+
scaleGridLineColor : "rgba(0,0,0,.05)",
|
65 |
+
|
66 |
+
//Number - Width of the grid lines
|
67 |
+
scaleGridLineWidth : 1,
|
68 |
+
|
69 |
+
//Boolean - Whether the line is curved between points
|
70 |
+
bezierCurve : true,
|
71 |
+
|
72 |
+
//Number - Tension of the bezier curve between points
|
73 |
+
bezierCurveTension : 0.4,
|
74 |
+
|
75 |
+
//Boolean - Whether to show a dot for each point
|
76 |
+
pointDot : true,
|
77 |
+
|
78 |
+
//Number - Radius of each point dot in pixels
|
79 |
+
pointDotRadius : 4,
|
80 |
+
|
81 |
+
//Number - Pixel width of point dot stroke
|
82 |
+
pointDotStrokeWidth : 1,
|
83 |
+
|
84 |
+
//Number - amount extra to add to the radius to cater for hit detection outside the drawn point
|
85 |
+
pointHitDetectionRadius : 20,
|
86 |
+
|
87 |
+
//Boolean - Whether to show a stroke for datasets
|
88 |
+
datasetStroke : true,
|
89 |
+
|
90 |
+
//Number - Pixel width of dataset stroke
|
91 |
+
datasetStrokeWidth : 2,
|
92 |
+
|
93 |
+
//Boolean - Whether to fill the dataset with a colour
|
94 |
+
datasetFill : true,
|
95 |
+
{% raw %}
|
96 |
+
//String - A legend template
|
97 |
+
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].lineColor%>\"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>"
|
98 |
+
{% endraw %}
|
99 |
+
};
|
100 |
+
```
|
101 |
+
|
102 |
+
You can override these for your `Chart` instance by passing a second argument into the `Line` method as an object with the keys you want to override.
|
103 |
+
|
104 |
+
For example, we could have a line chart without bezier curves between points by doing the following:
|
105 |
+
|
106 |
+
```javascript
|
107 |
+
new Chart(ctx).Line(data, {
|
108 |
+
bezierCurve: false
|
109 |
+
});
|
110 |
+
// This will create a chart with all of the default options, merged from the global config,
|
111 |
+
// and the Line chart defaults, but this particular instance will have `bezierCurve` set to false.
|
112 |
+
```
|
113 |
+
|
114 |
+
We can also change these defaults values for each Line type that is created, this object is available at `Chart.defaults.Line`.
|
115 |
+
|
116 |
+
|
117 |
+
### Prototype methods
|
118 |
+
|
119 |
+
#### .getPointsAtEvent( event )
|
120 |
+
|
121 |
+
Calling `getPointsAtEvent(event)` on your Chart instance passing an argument of an event, or jQuery event, will return the point elements that are at that the same position of that event.
|
122 |
+
|
123 |
+
```javascript
|
124 |
+
canvas.onclick = function(evt){
|
125 |
+
var activePoints = myLineChart.getPointsAtEvent(evt);
|
126 |
+
// => activePoints is an array of points on the canvas that are at the same position as the click event.
|
127 |
+
};
|
128 |
+
```
|
129 |
+
|
130 |
+
This functionality may be useful for implementing DOM based tooltips, or triggering custom behaviour in your application.
|
131 |
+
|
132 |
+
#### .update( )
|
133 |
+
|
134 |
+
Calling `update()` on your Chart instance will re-render the chart with any updated values, allowing you to edit the value of multiple existing points, then render those in one animated render loop.
|
135 |
+
|
136 |
+
```javascript
|
137 |
+
myLineChart.datasets[0].points[2].value = 50;
|
138 |
+
// Would update the first dataset's value of 'March' to be 50
|
139 |
+
myLineChart.update();
|
140 |
+
// Calling update now animates the position of March from 90 to 50.
|
141 |
+
```
|
142 |
+
|
143 |
+
#### .addData( valuesArray, label )
|
144 |
+
|
145 |
+
Calling `addData(valuesArray, label)` on your Chart instance passing an array of values for each dataset, along with a label for those points.
|
146 |
+
|
147 |
+
```javascript
|
148 |
+
// The values array passed into addData should be one for each dataset in the chart
|
149 |
+
myLineChart.addData([40, 60], "August");
|
150 |
+
// This new data will now animate at the end of the chart.
|
151 |
+
```
|
152 |
+
|
153 |
+
#### .removeData( )
|
154 |
+
|
155 |
+
Calling `removeData()` on your Chart instance will remove the first value for all datasets on the chart.
|
156 |
+
|
157 |
+
```javascript
|
158 |
+
myLineChart.removeData();
|
159 |
+
// The chart will remove the first point and animate other points into place
|
160 |
+
```
|
lib/Chart_js/docs/02-Bar-Chart.md
ADDED
@@ -0,0 +1,143 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
---
|
2 |
+
title: Bar Chart
|
3 |
+
anchor: bar-chart
|
4 |
+
---
|
5 |
+
|
6 |
+
### Introduction
|
7 |
+
A bar chart is a way of showing data as bars.
|
8 |
+
|
9 |
+
It is sometimes used to show trend data, and the comparison of multiple data sets side by side.
|
10 |
+
|
11 |
+
<div class="canvas-holder">
|
12 |
+
<canvas width="250" height="125"></canvas>
|
13 |
+
</div>
|
14 |
+
|
15 |
+
### Example usage
|
16 |
+
```javascript
|
17 |
+
var myBarChart = new Chart(ctx).Bar(data, options);
|
18 |
+
```
|
19 |
+
|
20 |
+
### Data structure
|
21 |
+
|
22 |
+
```javascript
|
23 |
+
var data = {
|
24 |
+
labels: ["January", "February", "March", "April", "May", "June", "July"],
|
25 |
+
datasets: [
|
26 |
+
{
|
27 |
+
label: "My First dataset",
|
28 |
+
fillColor: "rgba(220,220,220,0.5)",
|
29 |
+
strokeColor: "rgba(220,220,220,0.8)",
|
30 |
+
highlightFill: "rgba(220,220,220,0.75)",
|
31 |
+
highlightStroke: "rgba(220,220,220,1)",
|
32 |
+
data: [65, 59, 80, 81, 56, 55, 40]
|
33 |
+
},
|
34 |
+
{
|
35 |
+
label: "My Second dataset",
|
36 |
+
fillColor: "rgba(151,187,205,0.5)",
|
37 |
+
strokeColor: "rgba(151,187,205,0.8)",
|
38 |
+
highlightFill: "rgba(151,187,205,0.75)",
|
39 |
+
highlightStroke: "rgba(151,187,205,1)",
|
40 |
+
data: [28, 48, 40, 19, 86, 27, 90]
|
41 |
+
}
|
42 |
+
]
|
43 |
+
};
|
44 |
+
```
|
45 |
+
The bar chart has the a very similar data structure to the line chart, and has an array of datasets, each with colours and an array of data. Again, colours are in CSS format.
|
46 |
+
We have an array of labels too for display. In the example, we are showing the same data as the previous line chart example.
|
47 |
+
|
48 |
+
The label key on each dataset is optional, and can be used when generating a scale for the chart.
|
49 |
+
|
50 |
+
### Chart Options
|
51 |
+
|
52 |
+
These are the customisation options specific to Bar charts. These options are merged with the [global chart configuration options](#getting-started-global-chart-configuration), and form the options of the chart.
|
53 |
+
|
54 |
+
```javascript
|
55 |
+
{
|
56 |
+
//Boolean - Whether the scale should start at zero, or an order of magnitude down from the lowest value
|
57 |
+
scaleBeginAtZero : true,
|
58 |
+
|
59 |
+
//Boolean - Whether grid lines are shown across the chart
|
60 |
+
scaleShowGridLines : true,
|
61 |
+
|
62 |
+
//String - Colour of the grid lines
|
63 |
+
scaleGridLineColor : "rgba(0,0,0,.05)",
|
64 |
+
|
65 |
+
//Number - Width of the grid lines
|
66 |
+
scaleGridLineWidth : 1,
|
67 |
+
|
68 |
+
//Boolean - If there is a stroke on each bar
|
69 |
+
barShowStroke : true,
|
70 |
+
|
71 |
+
//Number - Pixel width of the bar stroke
|
72 |
+
barStrokeWidth : 2,
|
73 |
+
|
74 |
+
//Number - Spacing between each of the X value sets
|
75 |
+
barValueSpacing : 5,
|
76 |
+
|
77 |
+
//Number - Spacing between data sets within X values
|
78 |
+
barDatasetSpacing : 1,
|
79 |
+
{% raw %}
|
80 |
+
//String - A legend template
|
81 |
+
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].lineColor%>\"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>"
|
82 |
+
{% endraw %}
|
83 |
+
}
|
84 |
+
```
|
85 |
+
|
86 |
+
You can override these for your `Chart` instance by passing a second argument into the `Bar` method as an object with the keys you want to override.
|
87 |
+
|
88 |
+
For example, we could have a bar chart without a stroke on each bar by doing the following:
|
89 |
+
|
90 |
+
```javascript
|
91 |
+
new Chart(ctx).Bar(data, {
|
92 |
+
barShowStroke: false
|
93 |
+
});
|
94 |
+
// This will create a chart with all of the default options, merged from the global config,
|
95 |
+
// and the Bar chart defaults but this particular instance will have `barShowStroke` set to false.
|
96 |
+
```
|
97 |
+
|
98 |
+
We can also change these defaults values for each Bar type that is created, this object is available at `Chart.defaults.Bar`.
|
99 |
+
|
100 |
+
### Prototype methods
|
101 |
+
|
102 |
+
#### .getBarsAtEvent( event )
|
103 |
+
|
104 |
+
Calling `getBarsAtEvent(event)` on your Chart instance passing an argument of an event, or jQuery event, will return the bar elements that are at that the same position of that event.
|
105 |
+
|
106 |
+
```javascript
|
107 |
+
canvas.onclick = function(evt){
|
108 |
+
var activeBars = myBarChart.getBarsAtEvent(evt);
|
109 |
+
// => activeBars is an array of bars on the canvas that are at the same position as the click event.
|
110 |
+
};
|
111 |
+
```
|
112 |
+
|
113 |
+
This functionality may be useful for implementing DOM based tooltips, or triggering custom behaviour in your application.
|
114 |
+
|
115 |
+
#### .update( )
|
116 |
+
|
117 |
+
Calling `update()` on your Chart instance will re-render the chart with any updated values, allowing you to edit the value of multiple existing points, then render those in one animated render loop.
|
118 |
+
|
119 |
+
```javascript
|
120 |
+
myBarChart.datasets[0].bars[2].value = 50;
|
121 |
+
// Would update the first dataset's value of 'March' to be 50
|
122 |
+
myBarChart.update();
|
123 |
+
// Calling update now animates the position of March from 90 to 50.
|
124 |
+
```
|
125 |
+
|
126 |
+
#### .addData( valuesArray, label )
|
127 |
+
|
128 |
+
Calling `addData(valuesArray, label)` on your Chart instance passing an array of values for each dataset, along with a label for those bars.
|
129 |
+
|
130 |
+
```javascript
|
131 |
+
// The values array passed into addData should be one for each dataset in the chart
|
132 |
+
myBarChart.addData([40, 60], "August");
|
133 |
+
// The new data will now animate at the end of the chart.
|
134 |
+
```
|
135 |
+
|
136 |
+
#### .removeData( )
|
137 |
+
|
138 |
+
Calling `removeData()` on your Chart instance will remove the first value for all datasets on the chart.
|
139 |
+
|
140 |
+
```javascript
|
141 |
+
myBarChart.removeData();
|
142 |
+
// The chart will now animate and remove the first bar
|
143 |
+
```
|
lib/Chart_js/docs/03-Radar-Chart.md
ADDED
@@ -0,0 +1,177 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
---
|
2 |
+
title: Radar Chart
|
3 |
+
anchor: radar-chart
|
4 |
+
---
|
5 |
+
|
6 |
+
###Introduction
|
7 |
+
A radar chart is a way of showing multiple data points and the variation between them.
|
8 |
+
|
9 |
+
They are often useful for comparing the points of two or more different data sets.
|
10 |
+
|
11 |
+
<div class="canvas-holder">
|
12 |
+
<canvas width="250" height="125"></canvas>
|
13 |
+
</div>
|
14 |
+
|
15 |
+
###Example usage
|
16 |
+
|
17 |
+
```javascript
|
18 |
+
var myRadarChart = new Chart(ctx).Radar(data, options);
|
19 |
+
```
|
20 |
+
|
21 |
+
###Data structure
|
22 |
+
```javascript
|
23 |
+
var data = {
|
24 |
+
labels: ["Eating", "Drinking", "Sleeping", "Designing", "Coding", "Cycling", "Running"],
|
25 |
+
datasets: [
|
26 |
+
{
|
27 |
+
label: "My First dataset",
|
28 |
+
fillColor: "rgba(220,220,220,0.2)",
|
29 |
+
strokeColor: "rgba(220,220,220,1)",
|
30 |
+
pointColor: "rgba(220,220,220,1)",
|
31 |
+
pointStrokeColor: "#fff",
|
32 |
+
pointHighlightFill: "#fff",
|
33 |
+
pointHighlightStroke: "rgba(220,220,220,1)",
|
34 |
+
data: [65, 59, 90, 81, 56, 55, 40]
|
35 |
+
},
|
36 |
+
{
|
37 |
+
label: "My Second dataset",
|
38 |
+
fillColor: "rgba(151,187,205,0.2)",
|
39 |
+
strokeColor: "rgba(151,187,205,1)",
|
40 |
+
pointColor: "rgba(151,187,205,1)",
|
41 |
+
pointStrokeColor: "#fff",
|
42 |
+
pointHighlightFill: "#fff",
|
43 |
+
pointHighlightStroke: "rgba(151,187,205,1)",
|
44 |
+
data: [28, 48, 40, 19, 96, 27, 100]
|
45 |
+
}
|
46 |
+
]
|
47 |
+
};
|
48 |
+
```
|
49 |
+
For a radar chart, to provide context of what each point means, we include an array of strings that show around each point in the chart.
|
50 |
+
For the radar chart data, we have an array of datasets. Each of these is an object, with a fill colour, a stroke colour, a colour for the fill of each point, and a colour for the stroke of each point. We also have an array of data values.
|
51 |
+
|
52 |
+
The label key on each dataset is optional, and can be used when generating a scale for the chart.
|
53 |
+
|
54 |
+
### Chart options
|
55 |
+
|
56 |
+
These are the customisation options specific to Radar charts. These options are merged with the [global chart configuration options](#getting-started-global-chart-configuration), and form the options of the chart.
|
57 |
+
|
58 |
+
|
59 |
+
```javascript
|
60 |
+
{
|
61 |
+
//Boolean - Whether to show lines for each scale point
|
62 |
+
scaleShowLine : true,
|
63 |
+
|
64 |
+
//Boolean - Whether we show the angle lines out of the radar
|
65 |
+
angleShowLineOut : true,
|
66 |
+
|
67 |
+
//Boolean - Whether to show labels on the scale
|
68 |
+
scaleShowLabels : false,
|
69 |
+
|
70 |
+
// Boolean - Whether the scale should begin at zero
|
71 |
+
scaleBeginAtZero : true,
|
72 |
+
|
73 |
+
//String - Colour of the angle line
|
74 |
+
angleLineColor : "rgba(0,0,0,.1)",
|
75 |
+
|
76 |
+
//Number - Pixel width of the angle line
|
77 |
+
angleLineWidth : 1,
|
78 |
+
|
79 |
+
//String - Point label font declaration
|
80 |
+
pointLabelFontFamily : "'Arial'",
|
81 |
+
|
82 |
+
//String - Point label font weight
|
83 |
+
pointLabelFontStyle : "normal",
|
84 |
+
|
85 |
+
//Number - Point label font size in pixels
|
86 |
+
pointLabelFontSize : 10,
|
87 |
+
|
88 |
+
//String - Point label font colour
|
89 |
+
pointLabelFontColor : "#666",
|
90 |
+
|
91 |
+
//Boolean - Whether to show a dot for each point
|
92 |
+
pointDot : true,
|
93 |
+
|
94 |
+
//Number - Radius of each point dot in pixels
|
95 |
+
pointDotRadius : 3,
|
96 |
+
|
97 |
+
//Number - Pixel width of point dot stroke
|
98 |
+
pointDotStrokeWidth : 1,
|
99 |
+
|
100 |
+
//Number - amount extra to add to the radius to cater for hit detection outside the drawn point
|
101 |
+
pointHitDetectionRadius : 20,
|
102 |
+
|
103 |
+
//Boolean - Whether to show a stroke for datasets
|
104 |
+
datasetStroke : true,
|
105 |
+
|
106 |
+
//Number - Pixel width of dataset stroke
|
107 |
+
datasetStrokeWidth : 2,
|
108 |
+
|
109 |
+
//Boolean - Whether to fill the dataset with a colour
|
110 |
+
datasetFill : true,
|
111 |
+
{% raw %}
|
112 |
+
//String - A legend template
|
113 |
+
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].lineColor%>\"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>"
|
114 |
+
{% endraw %}
|
115 |
+
}
|
116 |
+
```
|
117 |
+
|
118 |
+
|
119 |
+
You can override these for your `Chart` instance by passing a second argument into the `Radar` method as an object with the keys you want to override.
|
120 |
+
|
121 |
+
For example, we could have a radar chart without a point for each on piece of data by doing the following:
|
122 |
+
|
123 |
+
```javascript
|
124 |
+
new Chart(ctx).Radar(data, {
|
125 |
+
pointDot: false
|
126 |
+
});
|
127 |
+
// This will create a chart with all of the default options, merged from the global config,
|
128 |
+
// and the Bar chart defaults but this particular instance will have `pointDot` set to false.
|
129 |
+
```
|
130 |
+
|
131 |
+
We can also change these defaults values for each Radar type that is created, this object is available at `Chart.defaults.Radar`.
|
132 |
+
|
133 |
+
|
134 |
+
### Prototype methods
|
135 |
+
|
136 |
+
#### .getPointsAtEvent( event )
|
137 |
+
|
138 |
+
Calling `getPointsAtEvent(event)` on your Chart instance passing an argument of an event, or jQuery event, will return the point elements that are at that the same position of that event.
|
139 |
+
|
140 |
+
```javascript
|
141 |
+
canvas.onclick = function(evt){
|
142 |
+
var activePoints = myRadarChart.getPointsAtEvent(evt);
|
143 |
+
// => activePoints is an array of points on the canvas that are at the same position as the click event.
|
144 |
+
};
|
145 |
+
```
|
146 |
+
|
147 |
+
This functionality may be useful for implementing DOM based tooltips, or triggering custom behaviour in your application.
|
148 |
+
|
149 |
+
#### .update( )
|
150 |
+
|
151 |
+
Calling `update()` on your Chart instance will re-render the chart with any updated values, allowing you to edit the value of multiple existing points, then render those in one animated render loop.
|
152 |
+
|
153 |
+
```javascript
|
154 |
+
myRadarChart.datasets[0].points[2].value = 50;
|
155 |
+
// Would update the first dataset's value of 'Sleeping' to be 50
|
156 |
+
myRadarChart.update();
|
157 |
+
// Calling update now animates the position of Sleeping from 90 to 50.
|
158 |
+
```
|
159 |
+
|
160 |
+
#### .addData( valuesArray, label )
|
161 |
+
|
162 |
+
Calling `addData(valuesArray, label)` on your Chart instance passing an array of values for each dataset, along with a label for those points.
|
163 |
+
|
164 |
+
```javascript
|
165 |
+
// The values array passed into addData should be one for each dataset in the chart
|
166 |
+
myRadarChart.addData([40, 60], "Dancing");
|
167 |
+
// The new data will now animate at the end of the chart.
|
168 |
+
```
|
169 |
+
|
170 |
+
#### .removeData( )
|
171 |
+
|
172 |
+
Calling `removeData()` on your Chart instance will remove the first value for all datasets on the chart.
|
173 |
+
|
174 |
+
```javascript
|
175 |
+
myRadarChart.removeData();
|
176 |
+
// Other points will now animate to their correct positions.
|
177 |
+
```
|
lib/Chart_js/docs/04-Polar-Area-Chart.md
ADDED
@@ -0,0 +1,172 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
---
|
2 |
+
title: Polar Area Chart
|
3 |
+
anchor: polar-area-chart
|
4 |
+
---
|
5 |
+
### Introduction
|
6 |
+
Polar area charts are similar to pie charts, but each segment has the same angle - the radius of the segment differs depending on the value.
|
7 |
+
|
8 |
+
This type of chart is often useful when we want to show a comparison data similar to a pie chart, but also show a scale of values for context.
|
9 |
+
|
10 |
+
<div class="canvas-holder">
|
11 |
+
<canvas width="250" height="125"></canvas>
|
12 |
+
</div>
|
13 |
+
|
14 |
+
### Example usage
|
15 |
+
|
16 |
+
```javascript
|
17 |
+
new Chart(ctx).PolarArea(data, options);
|
18 |
+
```
|
19 |
+
|
20 |
+
### Data structure
|
21 |
+
|
22 |
+
```javascript
|
23 |
+
var data = [
|
24 |
+
{
|
25 |
+
value: 300,
|
26 |
+
color:"#F7464A",
|
27 |
+
highlight: "#FF5A5E",
|
28 |
+
label: "Red"
|
29 |
+
},
|
30 |
+
{
|
31 |
+
value: 50,
|
32 |
+
color: "#46BFBD",
|
33 |
+
highlight: "#5AD3D1",
|
34 |
+
label: "Green"
|
35 |
+
},
|
36 |
+
{
|
37 |
+
value: 100,
|
38 |
+
color: "#FDB45C",
|
39 |
+
highlight: "#FFC870",
|
40 |
+
label: "Yellow"
|
41 |
+
},
|
42 |
+
{
|
43 |
+
value: 40,
|
44 |
+
color: "#949FB1",
|
45 |
+
highlight: "#A8B3C5",
|
46 |
+
label: "Grey"
|
47 |
+
},
|
48 |
+
{
|
49 |
+
value: 120,
|
50 |
+
color: "#4D5360",
|
51 |
+
highlight: "#616774",
|
52 |
+
label: "Dark Grey"
|
53 |
+
}
|
54 |
+
|
55 |
+
];
|
56 |
+
```
|
57 |
+
As you can see, for the chart data you pass in an array of objects, with a value and a colour. The value attribute should be a number, while the color attribute should be a string. Similar to CSS, for this string you can use HEX notation, RGB, RGBA or HSL.
|
58 |
+
|
59 |
+
### Chart options
|
60 |
+
|
61 |
+
These are the customisation options specific to Polar Area charts. These options are merged with the [global chart configuration options](#getting-started-global-chart-configuration), and form the options of the chart.
|
62 |
+
|
63 |
+
```javascript
|
64 |
+
{
|
65 |
+
//Boolean - Show a backdrop to the scale label
|
66 |
+
scaleShowLabelBackdrop : true,
|
67 |
+
|
68 |
+
//String - The colour of the label backdrop
|
69 |
+
scaleBackdropColor : "rgba(255,255,255,0.75)",
|
70 |
+
|
71 |
+
// Boolean - Whether the scale should begin at zero
|
72 |
+
scaleBeginAtZero : true,
|
73 |
+
|
74 |
+
//Number - The backdrop padding above & below the label in pixels
|
75 |
+
scaleBackdropPaddingY : 2,
|
76 |
+
|
77 |
+
//Number - The backdrop padding to the side of the label in pixels
|
78 |
+
scaleBackdropPaddingX : 2,
|
79 |
+
|
80 |
+
//Boolean - Show line for each value in the scale
|
81 |
+
scaleShowLine : true,
|
82 |
+
|
83 |
+
//Boolean - Stroke a line around each segment in the chart
|
84 |
+
segmentShowStroke : true,
|
85 |
+
|
86 |
+
//String - The colour of the stroke on each segement.
|
87 |
+
segmentStrokeColor : "#fff",
|
88 |
+
|
89 |
+
//Number - The width of the stroke value in pixels
|
90 |
+
segmentStrokeWidth : 2,
|
91 |
+
|
92 |
+
//Number - Amount of animation steps
|
93 |
+
animationSteps : 100,
|
94 |
+
|
95 |
+
//String - Animation easing effect.
|
96 |
+
animationEasing : "easeOutBounce",
|
97 |
+
|
98 |
+
//Boolean - Whether to animate the rotation of the chart
|
99 |
+
animateRotate : true,
|
100 |
+
|
101 |
+
//Boolean - Whether to animate scaling the chart from the centre
|
102 |
+
animateScale : false,
|
103 |
+
{% raw %}
|
104 |
+
//String - A legend template
|
105 |
+
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<segments.length; i++){%><li><span style=\"background-color:<%=segments[i].fillColor%>\"></span><%if(segments[i].label){%><%=segments[i].label%><%}%></li><%}%></ul>"
|
106 |
+
{% endraw %}
|
107 |
+
}
|
108 |
+
```
|
109 |
+
|
110 |
+
You can override these for your `Chart` instance by passing a second argument into the `PolarArea` method as an object with the keys you want to override.
|
111 |
+
|
112 |
+
For example, we could have a polar area chart with a black stroke on each segment like so:
|
113 |
+
|
114 |
+
```javascript
|
115 |
+
new Chart(ctx).PolarArea(data, {
|
116 |
+
segmentStrokeColor: "#000000"
|
117 |
+
});
|
118 |
+
// This will create a chart with all of the default options, merged from the global config,
|
119 |
+
// and the PolarArea chart defaults but this particular instance will have `segmentStrokeColor` set to `"#000000"`.
|
120 |
+
```
|
121 |
+
|
122 |
+
We can also change these defaults values for each PolarArea type that is created, this object is available at `Chart.defaults.PolarArea`.
|
123 |
+
|
124 |
+
### Prototype methods
|
125 |
+
|
126 |
+
#### .getSegmentsAtEvent( event )
|
127 |
+
|
128 |
+
Calling `getSegmentsAtEvent(event)` on your Chart instance passing an argument of an event, or jQuery event, will return the segment elements that are at that the same position of that event.
|
129 |
+
|
130 |
+
```javascript
|
131 |
+
canvas.onclick = function(evt){
|
132 |
+
var activePoints = myPolarAreaChart.getSegmentsAtEvent(evt);
|
133 |
+
// => activePoints is an array of segments on the canvas that are at the same position as the click event.
|
134 |
+
};
|
135 |
+
```
|
136 |
+
|
137 |
+
This functionality may be useful for implementing DOM based tooltips, or triggering custom behaviour in your application.
|
138 |
+
|
139 |
+
#### .update( )
|
140 |
+
|
141 |
+
Calling `update()` on your Chart instance will re-render the chart with any updated values, allowing you to edit the value of multiple existing points, then render those in one animated render loop.
|
142 |
+
|
143 |
+
```javascript
|
144 |
+
myPolarAreaChart.segments[1].value = 10;
|
145 |
+
// Would update the first dataset's value of 'Green' to be 10
|
146 |
+
myPolarAreaChart.update();
|
147 |
+
// Calling update now animates the position of Green from 50 to 10.
|
148 |
+
```
|
149 |
+
|
150 |
+
#### .addData( segmentData, index )
|
151 |
+
|
152 |
+
Calling `addData(segmentData, index)` on your Chart instance passing an object in the same format as in the constructor. There is an option second argument of 'index', this determines at what index the new segment should be inserted into the chart.
|
153 |
+
|
154 |
+
```javascript
|
155 |
+
// An object in the same format as the original data source
|
156 |
+
myPolarAreaChart.addData({
|
157 |
+
value: 130,
|
158 |
+
color: "#B48EAD",
|
159 |
+
highlight: "#C69CBE",
|
160 |
+
label: "Purple"
|
161 |
+
});
|
162 |
+
// The new segment will now animate in.
|
163 |
+
```
|
164 |
+
|
165 |
+
#### .removeData( index )
|
166 |
+
|
167 |
+
Calling `removeData(index)` on your Chart instance will remove segment at that particular index. If none is provided, it will default to the last segment.
|
168 |
+
|
169 |
+
```javascript
|
170 |
+
myPolarAreaChart.removeData();
|
171 |
+
// Other segments will update to fill the empty space left.
|
172 |
+
```
|
lib/Chart_js/docs/05-Pie-Doughnut-Chart.md
ADDED
@@ -0,0 +1,158 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
---
|
2 |
+
title: Pie & Doughnut Charts
|
3 |
+
anchor: doughnut-pie-chart
|
4 |
+
---
|
5 |
+
###Introduction
|
6 |
+
Pie and doughnut charts are probably the most commonly used chart there are. They are divided into segments, the arc of each segment shows the proportional value of each piece of data.
|
7 |
+
|
8 |
+
They are excellent at showing the relational proportions between data.
|
9 |
+
|
10 |
+
Pie and doughnut charts are effectively the same class in Chart.js, but have one different default value - their `percentageInnerCutout`. This equates what percentage of the inner should be cut out. This defaults to `0` for pie charts, and `50` for doughnuts.
|
11 |
+
|
12 |
+
They are also registered under two aliases in the `Chart` core. Other than their different default value, and different alias, they are exactly the same.
|
13 |
+
|
14 |
+
<div class="canvas-holder half">
|
15 |
+
<canvas width="250" height="125"></canvas>
|
16 |
+
</div>
|
17 |
+
|
18 |
+
<div class="canvas-holder half">
|
19 |
+
<canvas width="250" height="125"></canvas>
|
20 |
+
</div>
|
21 |
+
|
22 |
+
|
23 |
+
### Example usage
|
24 |
+
|
25 |
+
```javascript
|
26 |
+
// For a pie chart
|
27 |
+
var myPieChart = new Chart(ctx[0]).Pie(data,options);
|
28 |
+
|
29 |
+
// And for a doughnut chart
|
30 |
+
var myDoughnutChart = new Chart(ctx[1]).Doughnut(data,options);
|
31 |
+
```
|
32 |
+
|
33 |
+
### Data structure
|
34 |
+
|
35 |
+
```javascript
|
36 |
+
var data = [
|
37 |
+
{
|
38 |
+
value: 300,
|
39 |
+
color:"#F7464A",
|
40 |
+
highlight: "#FF5A5E",
|
41 |
+
label: "Red"
|
42 |
+
},
|
43 |
+
{
|
44 |
+
value: 50,
|
45 |
+
color: "#46BFBD",
|
46 |
+
highlight: "#5AD3D1",
|
47 |
+
label: "Green"
|
48 |
+
},
|
49 |
+
{
|
50 |
+
value: 100,
|
51 |
+
color: "#FDB45C",
|
52 |
+
highlight: "#FFC870",
|
53 |
+
label: "Yellow"
|
54 |
+
}
|
55 |
+
]
|
56 |
+
```
|
57 |
+
|
58 |
+
For a pie chart, you must pass in an array of objects with a value and a color property. The value attribute should be a number, Chart.js will total all of the numbers and calculate the relative proportion of each. The color attribute should be a string. Similar to CSS, for this string you can use HEX notation, RGB, RGBA or HSL.
|
59 |
+
|
60 |
+
### Chart options
|
61 |
+
|
62 |
+
These are the customisation options specific to Pie & Doughnut charts. These options are merged with the [global chart configuration options](#getting-started-global-chart-configuration), and form the options of the chart.
|
63 |
+
|
64 |
+
```javascript
|
65 |
+
{
|
66 |
+
//Boolean - Whether we should show a stroke on each segment
|
67 |
+
segmentShowStroke : true,
|
68 |
+
|
69 |
+
//String - The colour of each segment stroke
|
70 |
+
segmentStrokeColor : "#fff",
|
71 |
+
|
72 |
+
//Number - The width of each segment stroke
|
73 |
+
segmentStrokeWidth : 2,
|
74 |
+
|
75 |
+
//Number - The percentage of the chart that we cut out of the middle
|
76 |
+
percentageInnerCutout : 50, // This is 0 for Pie charts
|
77 |
+
|
78 |
+
//Number - Amount of animation steps
|
79 |
+
animationSteps : 100,
|
80 |
+
|
81 |
+
//String - Animation easing effect
|
82 |
+
animationEasing : "easeOutBounce",
|
83 |
+
|
84 |
+
//Boolean - Whether we animate the rotation of the Doughnut
|
85 |
+
animateRotate : true,
|
86 |
+
|
87 |
+
//Boolean - Whether we animate scaling the Doughnut from the centre
|
88 |
+
animateScale : false,
|
89 |
+
{% raw %}
|
90 |
+
//String - A legend template
|
91 |
+
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<segments.length; i++){%><li><span style=\"background-color:<%=segments[i].fillColor%>\"></span><%if(segments[i].label){%><%=segments[i].label%><%}%></li><%}%></ul>"
|
92 |
+
{% endraw %}
|
93 |
+
}
|
94 |
+
```
|
95 |
+
You can override these for your `Chart` instance by passing a second argument into the `Doughnut` method as an object with the keys you want to override.
|
96 |
+
|
97 |
+
For example, we could have a doughnut chart that animates by scaling out from the centre like so:
|
98 |
+
|
99 |
+
```javascript
|
100 |
+
new Chart(ctx).Doughnut(data, {
|
101 |
+
animateScale: true
|
102 |
+
});
|
103 |
+
// This will create a chart with all of the default options, merged from the global config,
|
104 |
+
// and the Doughnut chart defaults but this particular instance will have `animateScale` set to `true`.
|
105 |
+
```
|
106 |
+
|
107 |
+
We can also change these default values for each Doughnut type that is created, this object is available at `Chart.defaults.Doughnut`. Pie charts also have a clone of these defaults available to change at `Chart.defaults.Pie`, with the only difference being `percentageInnerCutout` being set to 0.
|
108 |
+
|
109 |
+
### Prototype methods
|
110 |
+
|
111 |
+
#### .getSegmentsAtEvent( event )
|
112 |
+
|
113 |
+
Calling `getSegmentsAtEvent(event)` on your Chart instance passing an argument of an event, or jQuery event, will return the segment elements that are at the same position of that event.
|
114 |
+
|
115 |
+
```javascript
|
116 |
+
canvas.onclick = function(evt){
|
117 |
+
var activePoints = myDoughnutChart.getSegmentsAtEvent(evt);
|
118 |
+
// => activePoints is an array of segments on the canvas that are at the same position as the click event.
|
119 |
+
};
|
120 |
+
```
|
121 |
+
|
122 |
+
This functionality may be useful for implementing DOM based tooltips, or triggering custom behaviour in your application.
|
123 |
+
|
124 |
+
#### .update( )
|
125 |
+
|
126 |
+
Calling `update()` on your Chart instance will re-render the chart with any updated values, allowing you to edit the value of multiple existing points, then render those in one animated render loop.
|
127 |
+
|
128 |
+
```javascript
|
129 |
+
myDoughnutChart.segments[1].value = 10;
|
130 |
+
// Would update the first dataset's value of 'Green' to be 10
|
131 |
+
myDoughnutChart.update();
|
132 |
+
// Calling update now animates the circumference of the segment 'Green' from 50 to 10.
|
133 |
+
// and transitions other segment widths
|
134 |
+
```
|
135 |
+
|
136 |
+
#### .addData( segmentData, index )
|
137 |
+
|
138 |
+
Calling `addData(segmentData, index)` on your Chart instance passing an object in the same format as in the constructor. There is an optional second argument of 'index', this determines at what index the new segment should be inserted into the chart.
|
139 |
+
|
140 |
+
```javascript
|
141 |
+
// An object in the same format as the original data source
|
142 |
+
myDoughnutChart.addData({
|
143 |
+
value: 130,
|
144 |
+
color: "#B48EAD",
|
145 |
+
highlight: "#C69CBE",
|
146 |
+
label: "Purple"
|
147 |
+
});
|
148 |
+
// The new segment will now animate in.
|
149 |
+
```
|
150 |
+
|
151 |
+
#### .removeData( index )
|
152 |
+
|
153 |
+
Calling `removeData(index)` on your Chart instance will remove segment at that particular index. If none is provided, it will default to the last segment.
|
154 |
+
|
155 |
+
```javascript
|
156 |
+
myDoughnutChart.removeData();
|
157 |
+
// Other segments will update to fill the empty space left.
|
158 |
+
```
|
lib/Chart_js/docs/06-Advanced.md
ADDED
@@ -0,0 +1,152 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
---
|
2 |
+
title: Advanced usage
|
3 |
+
anchor: advanced-usage
|
4 |
+
---
|
5 |
+
|
6 |
+
|
7 |
+
### Prototype methods
|
8 |
+
|
9 |
+
For each chart, there are a set of global prototype methods on the shared `ChartType` which you may find useful. These are available on all charts created with Chart.js, but for the examples, let's use a line chart we've made.
|
10 |
+
|
11 |
+
```javascript
|
12 |
+
// For example:
|
13 |
+
var myLineChart = new Chart(ctx).Line(data);
|
14 |
+
```
|
15 |
+
|
16 |
+
#### .clear()
|
17 |
+
|
18 |
+
Will clear the chart canvas. Used extensively internally between animation frames, but you might find it useful.
|
19 |
+
|
20 |
+
```javascript
|
21 |
+
// Will clear the canvas that myLineChart is drawn on
|
22 |
+
myLineChart.clear();
|
23 |
+
// => returns 'this' for chainability
|
24 |
+
```
|
25 |
+
|
26 |
+
#### .stop()
|
27 |
+
|
28 |
+
Use this to stop any current animation loop. This will pause the chart during any current animation frame. Call `.render()` to re-animate.
|
29 |
+
|
30 |
+
```javascript
|
31 |
+
// Stops the charts animation loop at its current frame
|
32 |
+
myLineChart.stop();
|
33 |
+
// => returns 'this' for chainability
|
34 |
+
```
|
35 |
+
|
36 |
+
#### .resize()
|
37 |
+
|
38 |
+
Use this to manually resize the canvas element. This is run each time the browser is resized, but you can call this method manually if you change the size of the canvas nodes container element.
|
39 |
+
|
40 |
+
```javascript
|
41 |
+
// Resizes & redraws to fill its container element
|
42 |
+
myLineChart.resize();
|
43 |
+
// => returns 'this' for chainability
|
44 |
+
```
|
45 |
+
|
46 |
+
#### .destroy()
|
47 |
+
|
48 |
+
Use this to destroy any chart instances that are created. This will clean up any references stored to the chart object within Chart.js, along with any associated event listeners attached by Chart.js.
|
49 |
+
|
50 |
+
```javascript
|
51 |
+
// Destroys a specific chart instance
|
52 |
+
myLineChart.destroy();
|
53 |
+
```
|
54 |
+
|
55 |
+
#### .toBase64Image()
|
56 |
+
|
57 |
+
This returns a base 64 encoded string of the chart in it's current state.
|
58 |
+
|
59 |
+
```javascript
|
60 |
+
myLineChart.toBase64Image();
|
61 |
+
// => returns png data url of the image on the canvas
|
62 |
+
```
|
63 |
+
|
64 |
+
#### .generateLegend()
|
65 |
+
|
66 |
+
Returns an HTML string of a legend for that chart. The template for this legend is at `legendTemplate` in the chart options.
|
67 |
+
|
68 |
+
```javascript
|
69 |
+
myLineChart.generateLegend();
|
70 |
+
// => returns HTML string of a legend for this chart
|
71 |
+
```
|
72 |
+
|
73 |
+
### Writing new chart types
|
74 |
+
|
75 |
+
Chart.js 1.0 has been rewritten to provide a platform for developers to create their own custom chart types, and be able to share and utilise them through the Chart.js API.
|
76 |
+
|
77 |
+
The format is relatively simple, there are a set of utility helper methods under `Chart.helpers`, including things such as looping over collections, requesting animation frames, and easing equations.
|
78 |
+
|
79 |
+
On top of this, there are also some simple base classes of Chart elements, these all extend from `Chart.Element`, and include things such as points, bars and scales.
|
80 |
+
|
81 |
+
```javascript
|
82 |
+
Chart.Type.extend({
|
83 |
+
// Passing in a name registers this chart in the Chart namespace
|
84 |
+
name: "Scatter",
|
85 |
+
// Providing a defaults will also register the deafults in the chart namespace
|
86 |
+
defaults : {
|
87 |
+
options: "Here",
|
88 |
+
available: "at this.options"
|
89 |
+
},
|
90 |
+
// Initialize is fired when the chart is initialized - Data is passed in as a parameter
|
91 |
+
// Config is automatically merged by the core of Chart.js, and is available at this.options
|
92 |
+
initialize: function(data){
|
93 |
+
this.chart.ctx // The drawing context for this chart
|
94 |
+
this.chart.canvas // the canvas node for this chart
|
95 |
+
},
|
96 |
+
// Used to draw something on the canvas
|
97 |
+
draw: function() {
|
98 |
+
}
|
99 |
+
});
|
100 |
+
|
101 |
+
// Now we can create a new instance of our chart, using the Chart.js API
|
102 |
+
new Chart(ctx).Scatter(data);
|
103 |
+
// initialize is now run
|
104 |
+
```
|
105 |
+
|
106 |
+
### Extending existing chart types
|
107 |
+
|
108 |
+
We can also extend existing chart types, and expose them to the API in the same way. Let's say for example, we might want to run some more code when we initialize every Line chart.
|
109 |
+
|
110 |
+
```javascript
|
111 |
+
// Notice now we're extending the particular Line chart type, rather than the base class.
|
112 |
+
Chart.types.Line.extend({
|
113 |
+
// Passing in a name registers this chart in the Chart namespace in the same way
|
114 |
+
name: "LineAlt",
|
115 |
+
initialize: function(data){
|
116 |
+
console.log('My Line chart extension');
|
117 |
+
Chart.types.Line.prototype.initialize.apply(this, arguments);
|
118 |
+
}
|
119 |
+
});
|
120 |
+
|
121 |
+
// Creates a line chart in the same way
|
122 |
+
new Chart(ctx).LineAlt(data);
|
123 |
+
// but this logs 'My Line chart extension' in the console.
|
124 |
+
```
|
125 |
+
|
126 |
+
### Community extensions
|
127 |
+
|
128 |
+
- <a href="https://github.com/Regaddi/Chart.StackedBar.js" target"_blank">Stacked Bar Chart</a> by <a href="https://twitter.com/Regaddi" target="_blank">@Regaddi</a>
|
129 |
+
- <a href="https://github.com/CAYdenberg/Chart.js" target"_blank">Error bars (bar and line charts)</a> by <a href="https://twitter.com/CAYdenberg" target="_blank">@CAYdenberg</a>
|
130 |
+
|
131 |
+
### Creating custom builds
|
132 |
+
|
133 |
+
Chart.js uses <a href="http://gulpjs.com/" target="_blank">gulp</a> to build the library into a single JavaScript file. We can use this same build script with custom parameters in order to build a custom version.
|
134 |
+
|
135 |
+
Firstly, we need to ensure development dependencies are installed. With node and npm installed, after cloning the Chart.js repo to a local directory, and navigating to that directory in the command line, we can run the following:
|
136 |
+
|
137 |
+
```bash
|
138 |
+
npm install
|
139 |
+
npm install -g gulp
|
140 |
+
```
|
141 |
+
|
142 |
+
This will install the local development dependencies for Chart.js, along with a CLI for the JavaScript task runner <a href="http://gulpjs.com/" target="_blank">gulp</a>.
|
143 |
+
|
144 |
+
Now, we can run the `gulp build` task, and pass in a comma seperated list of types as an argument to build a custom version of Chart.js with only specified chart types.
|
145 |
+
|
146 |
+
Here we will create a version of Chart.js with only Line, Radar and Bar charts included:
|
147 |
+
|
148 |
+
```bash
|
149 |
+
gulp build --types=Line,Radar,Bar
|
150 |
+
```
|
151 |
+
|
152 |
+
This will output to the `/custom` directory, and write two files, Chart.js, and Chart.min.js with only those chart types included.
|
lib/Chart_js/docs/07-Notes.md
ADDED
@@ -0,0 +1,42 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
---
|
2 |
+
title: Notes
|
3 |
+
anchor: notes
|
4 |
+
---
|
5 |
+
|
6 |
+
### Browser support
|
7 |
+
Browser support for the canvas element is available in all modern & major mobile browsers <a href="http://caniuse.com/canvas" target="_blank">(caniuse.com/canvas)</a>.
|
8 |
+
|
9 |
+
For IE8 & below, I would recommend using the polyfill ExplorerCanvas - available at <a href="https://code.google.com/p/explorercanvas/" target="_blank">https://code.google.com/p/explorercanvas/</a>. It falls back to Internet explorer's format VML when canvas support is not available. Example use:
|
10 |
+
|
11 |
+
```html
|
12 |
+
<head>
|
13 |
+
<!--[if lte IE 8]>
|
14 |
+
<script src="excanvas.js"></script>
|
15 |
+
<![endif]-->
|
16 |
+
</head>
|
17 |
+
```
|
18 |
+
|
19 |
+
Usually I would recommend feature detection to choose whether or not to load a polyfill, rather than IE conditional comments, however in this case, VML is a Microsoft proprietary format, so it will only work in IE.
|
20 |
+
|
21 |
+
Some important points to note in my experience using ExplorerCanvas as a fallback.
|
22 |
+
|
23 |
+
- Initialise charts on load rather than DOMContentReady when using the library, as sometimes a race condition will occur, and it will result in an error when trying to get the 2d context of a canvas.
|
24 |
+
- New VML DOM elements are being created for each animation frame and there is no hardware acceleration. As a result animation is usually slow and jerky, with flashing text. It is a good idea to dynamically turn off animation based on canvas support. I recommend using the excellent <a href="http://modernizr.com/" target="_blank">Modernizr</a> to do this.
|
25 |
+
- When declaring fonts, the library explorercanvas requires the font name to be in single quotes inside the string. For example, instead of your scaleFontFamily property being simply "Arial", explorercanvas support, use "'Arial'" instead. Chart.js does this for default values.
|
26 |
+
|
27 |
+
### Bugs & issues
|
28 |
+
|
29 |
+
Please report these on the GitHub page - at <a href="https://github.com/nnnick/Chart.js" target="_blank">github.com/nnnick/Chart.js</a>. If you could include a link to a simple <a href="http://jsbin.com/" target="_blank">jsbin</a> or similar to demonstrate the issue, that'd be really helpful.
|
30 |
+
|
31 |
+
|
32 |
+
### Contributing
|
33 |
+
New contributions to the library are welcome, just a couple of guidelines:
|
34 |
+
|
35 |
+
- Tabs for indentation, not spaces please.
|
36 |
+
- Please ensure you're changing the individual files in `/src`, not the concatenated output in the `Chart.js` file in the root of the repo.
|
37 |
+
- Please check that your code will pass `jshint` code standards, `gulp jshint` will run this for you.
|
38 |
+
- Please keep pull requests concise, and document new functionality in the relevant `.md` file.
|
39 |
+
- Consider whether your changes are useful for all users, or if creating a Chart.js extension would be more appropriate.
|
40 |
+
|
41 |
+
### License
|
42 |
+
Chart.js is open source and available under the <a href="http://opensource.org/licenses/MIT" target="_blank">MIT license</a>.
|
lib/Chart_js/gulpfile.js
ADDED
@@ -0,0 +1,131 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
var gulp = require('gulp'),
|
2 |
+
concat = require('gulp-concat'),
|
3 |
+
uglify = require('gulp-uglify'),
|
4 |
+
util = require('gulp-util'),
|
5 |
+
jshint = require('gulp-jshint'),
|
6 |
+
size = require('gulp-size'),
|
7 |
+
connect = require('gulp-connect'),
|
8 |
+
replace = require('gulp-replace'),
|
9 |
+
inquirer = require('inquirer'),
|
10 |
+
semver = require('semver'),
|
11 |
+
exec = require('child_process').exec,
|
12 |
+
fs = require('fs'),
|
13 |
+
package = require('./package.json'),
|
14 |
+
bower = require('./bower.json');
|
15 |
+
|
16 |
+
var srcDir = './src/';
|
17 |
+
/*
|
18 |
+
* Usage : gulp build --types=Bar,Line,Doughnut
|
19 |
+
* Output: - A built Chart.js file with Core and types Bar, Line and Doughnut concatenated together
|
20 |
+
* - A minified version of this code, in Chart.min.js
|
21 |
+
*/
|
22 |
+
|
23 |
+
gulp.task('build', function(){
|
24 |
+
|
25 |
+
// Default to all of the chart types, with Chart.Core first
|
26 |
+
var srcFiles = [FileName('Core')],
|
27 |
+
isCustom = !!(util.env.types),
|
28 |
+
outputDir = (isCustom) ? 'custom' : '.';
|
29 |
+
if (isCustom){
|
30 |
+
util.env.types.split(',').forEach(function(type){ return srcFiles.push(FileName(type))});
|
31 |
+
}
|
32 |
+
else{
|
33 |
+
// Seems gulp-concat remove duplicates - nice!
|
34 |
+
// So we can use this to sort out dependency order - aka include Core first!
|
35 |
+
srcFiles.push(srcDir+'*');
|
36 |
+
}
|
37 |
+
|
38 |
+
return gulp.src(srcFiles)
|
39 |
+
.pipe(concat('Chart.js'))
|
40 |
+
.pipe(replace('{{ version }}', package.version))
|
41 |
+
.pipe(gulp.dest(outputDir))
|
42 |
+
.pipe(uglify({preserveComments:'some'}))
|
43 |
+
.pipe(concat('Chart.min.js'))
|
44 |
+
.pipe(gulp.dest(outputDir));
|
45 |
+
|
46 |
+
function FileName(moduleName){
|
47 |
+
return srcDir+'Chart.'+moduleName+'.js';
|
48 |
+
};
|
49 |
+
});
|
50 |
+
|
51 |
+
/*
|
52 |
+
* Usage : gulp bump
|
53 |
+
* Prompts: Version increment to bump
|
54 |
+
* Output: - New version number written into package.json & bower.json
|
55 |
+
*/
|
56 |
+
|
57 |
+
gulp.task('bump', function(complete){
|
58 |
+
util.log('Current version:', util.colors.cyan(package.version));
|
59 |
+
var choices = ['major', 'premajor', 'minor', 'preminor', 'patch', 'prepatch', 'prerelease'].map(function(versionType){
|
60 |
+
return versionType + ' (v' + semver.inc(package.version, versionType) + ')';
|
61 |
+
});
|
62 |
+
inquirer.prompt({
|
63 |
+
type: 'list',
|
64 |
+
name: 'version',
|
65 |
+
message: 'What version update would you like?',
|
66 |
+
choices: choices
|
67 |
+
}, function(res){
|
68 |
+
var increment = res.version.split(' ')[0],
|
69 |
+
newVersion = semver.inc(package.version, increment);
|
70 |
+
|
71 |
+
// Set the new versions into the bower/package object
|
72 |
+
package.version = newVersion;
|
73 |
+
bower.version = newVersion;
|
74 |
+
|
75 |
+
// Write these to their own files, then build the output
|
76 |
+
fs.writeFileSync('package.json', JSON.stringify(package, null, 2));
|
77 |
+
fs.writeFileSync('bower.json', JSON.stringify(bower, null, 2));
|
78 |
+
|
79 |
+
complete();
|
80 |
+
});
|
81 |
+
});
|
82 |
+
|
83 |
+
gulp.task('release', ['build'], function(){
|
84 |
+
exec('git tag -a v' + package.version);
|
85 |
+
});
|
86 |
+
|
87 |
+
gulp.task('jshint', function(){
|
88 |
+
return gulp.src(srcDir + '*.js')
|
89 |
+
.pipe(jshint())
|
90 |
+
.pipe(jshint.reporter('default'));
|
91 |
+
});
|
92 |
+
|
93 |
+
gulp.task('library-size', function(){
|
94 |
+
return gulp.src('Chart.min.js')
|
95 |
+
.pipe(size({
|
96 |
+
gzip: true
|
97 |
+
}));
|
98 |
+
});
|
99 |
+
|
100 |
+
gulp.task('module-sizes', function(){
|
101 |
+
return gulp.src(srcDir + '*.js')
|
102 |
+
.pipe(uglify({preserveComments:'some'}))
|
103 |
+
.pipe(size({
|
104 |
+
showFiles: true,
|
105 |
+
gzip: true
|
106 |
+
}))
|
107 |
+
});
|
108 |
+
|
109 |
+
gulp.task('watch', function(){
|
110 |
+
gulp.watch('./src/*', ['build']);
|
111 |
+
});
|
112 |
+
|
113 |
+
gulp.task('test', ['jshint']);
|
114 |
+
|
115 |
+
gulp.task('size', ['library-size', 'module-sizes']);
|
116 |
+
|
117 |
+
gulp.task('default', ['build', 'watch']);
|
118 |
+
|
119 |
+
gulp.task('server', function(){
|
120 |
+
connect.server({
|
121 |
+
port: 8000,
|
122 |
+
});
|
123 |
+
});
|
124 |
+
|
125 |
+
// Convenience task for opening the project straight from the command line
|
126 |
+
gulp.task('_open', function(){
|
127 |
+
exec('open http://localhost:8000');
|
128 |
+
exec('subl .');
|
129 |
+
});
|
130 |
+
|
131 |
+
gulp.task('dev', ['server', 'default']);
|
lib/Chart_js/package.json
ADDED
@@ -0,0 +1,24 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"name": "chart.js",
|
3 |
+
"homepage": "http://www.chartjs.org",
|
4 |
+
"description": "Simple HTML5 charts using the canvas element.",
|
5 |
+
"version": "1.0.1-beta.4",
|
6 |
+
"main": "Chart.js",
|
7 |
+
"repository": {
|
8 |
+
"type": "git",
|
9 |
+
"url": "https://github.com/nnnick/Chart.js.git"
|
10 |
+
},
|
11 |
+
"dependences": {},
|
12 |
+
"devDependencies": {
|
13 |
+
"gulp": "3.5.x",
|
14 |
+
"gulp-concat": "~2.1.x",
|
15 |
+
"gulp-connect": "~2.0.5",
|
16 |
+
"gulp-jshint": "~1.5.1",
|
17 |
+
"gulp-replace": "^0.4.0",
|
18 |
+
"gulp-size": "~0.4.0",
|
19 |
+
"gulp-uglify": "~0.2.x",
|
20 |
+
"gulp-util": "~2.2.x",
|
21 |
+
"inquirer": "^0.5.1",
|
22 |
+
"semver": "^3.0.1"
|
23 |
+
}
|
24 |
+
}
|
lib/Chart_js/samples/bar.html
ADDED
@@ -0,0 +1,48 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!doctype html>
|
2 |
+
<html>
|
3 |
+
<head>
|
4 |
+
<title>Bar Chart</title>
|
5 |
+
<script src="../Chart.js"></script>
|
6 |
+
</head>
|
7 |
+
<body>
|
8 |
+
<div style="width: 50%">
|
9 |
+
<canvas id="canvas" height="450" width="600"></canvas>
|
10 |
+
</div>
|
11 |
+
|
12 |
+
|
13 |
+
<script>
|
14 |
+
var randomScalingFactor = function(){ return Math.round(Math.random()*100)};
|
15 |
+
|
16 |
+
var barChartData = {
|
17 |
+
labels : ["January","February","March","April","May","June","July"],
|
18 |
+
datasets : [
|
19 |
+
{
|
20 |
+
showTooltips:true,
|
21 |
+
label: "My Second dataset",
|
22 |
+
fillColor : "rgba(220,220,220,0.5)",
|
23 |
+
strokeColor : "rgba(220,220,220,0.8)",
|
24 |
+
highlightFill: "rgba(220,220,220,0.75)",
|
25 |
+
highlightStroke: "rgba(220,220,220,1)",
|
26 |
+
data : [randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor()]
|
27 |
+
},
|
28 |
+
{
|
29 |
+
label: "My Second dataset",
|
30 |
+
fillColor : "rgba(151,187,205,0.5)",
|
31 |
+
strokeColor : "rgba(151,187,205,0.8)",
|
32 |
+
highlightFill : "rgba(151,187,205,0.75)",
|
33 |
+
highlightStroke : "rgba(151,187,205,1)",
|
34 |
+
data : [randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor()]
|
35 |
+
}
|
36 |
+
]
|
37 |
+
|
38 |
+
}
|
39 |
+
window.onload = function(){
|
40 |
+
var ctx = document.getElementById("canvas").getContext("2d");
|
41 |
+
window.myBar = new Chart(ctx).Bar(barChartData, {
|
42 |
+
responsive : true
|
43 |
+
});
|
44 |
+
}
|
45 |
+
|
46 |
+
</script>
|
47 |
+
</body>
|
48 |
+
</html>
|
lib/Chart_js/samples/doughnut.html
ADDED
@@ -0,0 +1,67 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!doctype html>
|
2 |
+
<html>
|
3 |
+
<head>
|
4 |
+
<title>Doughnut Chart</title>
|
5 |
+
<script src="../Chart.js"></script>
|
6 |
+
<style>
|
7 |
+
body{
|
8 |
+
padding: 0;
|
9 |
+
margin: 0;
|
10 |
+
}
|
11 |
+
#canvas-holder{
|
12 |
+
width:30%;
|
13 |
+
}
|
14 |
+
</style>
|
15 |
+
</head>
|
16 |
+
<body>
|
17 |
+
<div id="canvas-holder">
|
18 |
+
<canvas id="chart-area" width="500" height="500"/>
|
19 |
+
</div>
|
20 |
+
|
21 |
+
|
22 |
+
<script>
|
23 |
+
|
24 |
+
var doughnutData = [
|
25 |
+
{
|
26 |
+
value: 300,
|
27 |
+
color:"#F7464A",
|
28 |
+
highlight: "#FF5A5E",
|
29 |
+
label: "Red"
|
30 |
+
},
|
31 |
+
{
|
32 |
+
value: 50,
|
33 |
+
color: "#46BFBD",
|
34 |
+
highlight: "#5AD3D1",
|
35 |
+
label: "Green"
|
36 |
+
},
|
37 |
+
{
|
38 |
+
value: 100,
|
39 |
+
color: "#FDB45C",
|
40 |
+
highlight: "#FFC870",
|
41 |
+
label: "Yellow"
|
42 |
+
},
|
43 |
+
{
|
44 |
+
value: 40,
|
45 |
+
color: "#949FB1",
|
46 |
+
highlight: "#A8B3C5",
|
47 |
+
label: "Grey"
|
48 |
+
},
|
49 |
+
{
|
50 |
+
value: 120,
|
51 |
+
color: "#4D5360",
|
52 |
+
highlight: "#616774",
|
53 |
+
label: "Dark Grey"
|
54 |
+
}
|
55 |
+
|
56 |
+
];
|
57 |
+
|
58 |
+
window.onload = function(){
|
59 |
+
var ctx = document.getElementById("chart-area").getContext("2d");
|
60 |
+
window.myDoughnut = new Chart(ctx).Doughnut(doughnutData, {responsive : true});
|
61 |
+
};
|
62 |
+
|
63 |
+
|
64 |
+
|
65 |
+
</script>
|
66 |
+
</body>
|
67 |
+
</html>
|
lib/Chart_js/samples/line.html
ADDED
@@ -0,0 +1,54 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!doctype html>
|
2 |
+
<html>
|
3 |
+
<head>
|
4 |
+
<title>Line Chart</title>
|
5 |
+
<script src="../Chart.js"></script>
|
6 |
+
</head>
|
7 |
+
<body>
|
8 |
+
<div style="width:30%">
|
9 |
+
<div>
|
10 |
+
<canvas id="canvas" height="450" width="600"></canvas>
|
11 |
+
</div>
|
12 |
+
</div>
|
13 |
+
|
14 |
+
|
15 |
+
<script>
|
16 |
+
var randomScalingFactor = function(){ return Math.round(Math.random()*100)};
|
17 |
+
var lineChartData = {
|
18 |
+
labels : ["January","February","March","April","May","June","July"],
|
19 |
+
datasets : [
|
20 |
+
{
|
21 |
+
label: "My First dataset",
|
22 |
+
fillColor : "rgba(220,220,220,0.2)",
|
23 |
+
strokeColor : "rgba(220,220,220,1)",
|
24 |
+
pointColor : "rgba(220,220,220,1)",
|
25 |
+
pointStrokeColor : "#fff",
|
26 |
+
pointHighlightFill : "#fff",
|
27 |
+
pointHighlightStroke : "rgba(220,220,220,1)",
|
28 |
+
data : [randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor()]
|
29 |
+
},
|
30 |
+
{
|
31 |
+
label: "My Second dataset",
|
32 |
+
fillColor : "rgba(151,187,205,0.2)",
|
33 |
+
strokeColor : "rgba(151,187,205,1)",
|
34 |
+
pointColor : "rgba(151,187,205,1)",
|
35 |
+
pointStrokeColor : "#fff",
|
36 |
+
pointHighlightFill : "#fff",
|
37 |
+
pointHighlightStroke : "rgba(151,187,205,1)",
|
38 |
+
data : [randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor(),randomScalingFactor()]
|
39 |
+
}
|
40 |
+
]
|
41 |
+
|
42 |
+
}
|
43 |
+
|
44 |
+
window.onload = function(){
|
45 |
+
var ctx = document.getElementById("canvas").getContext("2d");
|
46 |
+
window.myLine = new Chart(ctx).Line(lineChartData, {
|
47 |
+
responsive: true
|
48 |
+
});
|
49 |
+
}
|
50 |
+
|
51 |
+
|
52 |
+
</script>
|
53 |
+
</body>
|
54 |
+
</html>
|
lib/Chart_js/samples/pie.html
ADDED
@@ -0,0 +1,58 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!doctype html>
|
2 |
+
<html>
|
3 |
+
<head>
|
4 |
+
<title>Pie Chart</title>
|
5 |
+
<script src="../Chart.js"></script>
|
6 |
+
</head>
|
7 |
+
<body>
|
8 |
+
<div id="canvas-holder">
|
9 |
+
<canvas id="chart-area" width="300" height="300"/>
|
10 |
+
</div>
|
11 |
+
|
12 |
+
|
13 |
+
<script>
|
14 |
+
|
15 |
+
var pieData = [
|
16 |
+
{
|
17 |
+
value: 300,
|
18 |
+
color:"#F7464A",
|
19 |
+
highlight: "#FF5A5E",
|
20 |
+
label: "Red"
|
21 |
+
},
|
22 |
+
{
|
23 |
+
value: 50,
|
24 |
+
color: "#46BFBD",
|
25 |
+
highlight: "#5AD3D1",
|
26 |
+
label: "Green"
|
27 |
+
},
|
28 |
+
{
|
29 |
+
value: 100,
|
30 |
+
color: "#FDB45C",
|
31 |
+
highlight: "#FFC870",
|
32 |
+
label: "Yellow"
|
33 |
+
},
|
34 |
+
{
|
35 |
+
value: 40,
|
36 |
+
color: "#949FB1",
|
37 |
+
highlight: "#A8B3C5",
|
38 |
+
label: "Grey"
|
39 |
+
},
|
40 |
+
{
|
41 |
+
value: 120,
|
42 |
+
color: "#4D5360",
|
43 |
+
highlight: "#616774",
|
44 |
+
label: "Dark Grey"
|
45 |
+
}
|
46 |
+
|
47 |
+
];
|
48 |
+
|
49 |
+
window.onload = function(){
|
50 |
+
var ctx = document.getElementById("chart-area").getContext("2d");
|
51 |
+
window.myPie = new Chart(ctx).Pie(pieData);
|
52 |
+
};
|
53 |
+
|
54 |
+
|
55 |
+
|
56 |
+
</script>
|
57 |
+
</body>
|
58 |
+
</html>
|
lib/Chart_js/samples/polar-area.html
ADDED
@@ -0,0 +1,60 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!doctype html>
|
2 |
+
<html>
|
3 |
+
<head>
|
4 |
+
<title>Polar Area Chart</title>
|
5 |
+
<script src="../Chart.js"></script>
|
6 |
+
</head>
|
7 |
+
<body>
|
8 |
+
<div id="canvas-holder" style="width:30%">
|
9 |
+
<canvas id="chart-area" width="300" height="300"/>
|
10 |
+
</div>
|
11 |
+
|
12 |
+
|
13 |
+
<script>
|
14 |
+
|
15 |
+
var polarData = [
|
16 |
+
{
|
17 |
+
value: 300,
|
18 |
+
color:"#F7464A",
|
19 |
+
highlight: "#FF5A5E",
|
20 |
+
label: "Red"
|
21 |
+
},
|
22 |
+
{
|
23 |
+
value: 50,
|
24 |
+
color: "#46BFBD",
|
25 |
+
highlight: "#5AD3D1",
|
26 |
+
label: "Green"
|
27 |
+
},
|
28 |
+
{
|
29 |
+
value: 100,
|
30 |
+
color: "#FDB45C",
|
31 |
+
highlight: "#FFC870",
|
32 |
+
label: "Yellow"
|
33 |
+
},
|
34 |
+
{
|
35 |
+
value: 40,
|
36 |
+
color: "#949FB1",
|
37 |
+
highlight: "#A8B3C5",
|
38 |
+
label: "Grey"
|
39 |
+
},
|
40 |
+
{
|
41 |
+
value: 120,
|
42 |
+
color: "#4D5360",
|
43 |
+
highlight: "#616774",
|
44 |
+
label: "Dark Grey"
|
45 |
+
}
|
46 |
+
|
47 |
+
];
|
48 |
+
|
49 |
+
window.onload = function(){
|
50 |
+
var ctx = document.getElementById("chart-area").getContext("2d");
|
51 |
+
window.myPolarArea = new Chart(ctx).PolarArea(polarData, {
|
52 |
+
responsive:true
|
53 |
+
});
|
54 |
+
};
|
55 |
+
|
56 |
+
|
57 |
+
|
58 |
+
</script>
|
59 |
+
</body>
|
60 |
+
</html>
|
lib/Chart_js/samples/radar.html
ADDED
@@ -0,0 +1,53 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<!doctype html>
|
2 |
+
<html>
|
3 |
+
<head>
|
4 |
+
<title>Radar Chart</title>
|
5 |
+
<script src="../Chart.js"></script>
|
6 |
+
<meta name = "viewport" content = "initial-scale = 1, user-scalable = no">
|
7 |
+
<style>
|
8 |
+
canvas{
|
9 |
+
}
|
10 |
+
</style>
|
11 |
+
</head>
|
12 |
+
<body>
|
13 |
+
<div style="width:30%">
|
14 |
+
<canvas id="canvas" height="450" width="450"></canvas>
|
15 |
+
</div>
|
16 |
+
|
17 |
+
|
18 |
+
<script>
|
19 |
+
var radarChartData = {
|
20 |
+
labels: ["Eating", "Drinking", "Sleeping", "Designing", "Coding", "Cycling", "Running"],
|
21 |
+
datasets: [
|
22 |
+
{
|
23 |
+
label: "My First dataset",
|
24 |
+
fillColor: "rgba(220,220,220,0.2)",
|
25 |
+
strokeColor: "rgba(220,220,220,1)",
|
26 |
+
pointColor: "rgba(220,220,220,1)",
|
27 |
+
pointStrokeColor: "#fff",
|
28 |
+
pointHighlightFill: "#fff",
|
29 |
+
pointHighlightStroke: "rgba(220,220,220,1)",
|
30 |
+
data: [65,59,90,81,56,55,40]
|
31 |
+
},
|
32 |
+
{
|
33 |
+
label: "My Second dataset",
|
34 |
+
fillColor: "rgba(151,187,205,0.2)",
|
35 |
+
strokeColor: "rgba(151,187,205,1)",
|
36 |
+
pointColor: "rgba(151,187,205,1)",
|
37 |
+
pointStrokeColor: "#fff",
|
38 |
+
pointHighlightFill: "#fff",
|
39 |
+
pointHighlightStroke: "rgba(151,187,205,1)",
|
40 |
+
data: [28,48,40,19,96,27,100]
|
41 |
+
}
|
42 |
+
]
|
43 |
+
};
|
44 |
+
|
45 |
+
window.onload = function(){
|
46 |
+
window.myRadar = new Chart(document.getElementById("canvas").getContext("2d")).Radar(radarChartData, {
|
47 |
+
responsive: true
|
48 |
+
});
|
49 |
+
}
|
50 |
+
|
51 |
+
</script>
|
52 |
+
</body>
|
53 |
+
</html>
|
lib/Chart_js/src/Chart.Bar.js
ADDED
@@ -0,0 +1,294 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
(function(){
|
2 |
+
"use strict";
|
3 |
+
|
4 |
+
var root = this,
|
5 |
+
Chart = root.Chart,
|
6 |
+
helpers = Chart.helpers;
|
7 |
+
|
8 |
+
|
9 |
+
var defaultConfig = {
|
10 |
+
//Boolean - Whether the scale should start at zero, or an order of magnitude down from the lowest value
|
11 |
+
scaleBeginAtZero : true,
|
12 |
+
|
13 |
+
//Boolean - Whether grid lines are shown across the chart
|
14 |
+
scaleShowGridLines : true,
|
15 |
+
|
16 |
+
//String - Colour of the grid lines
|
17 |
+
scaleGridLineColor : "rgba(0,0,0,.05)",
|
18 |
+
|
19 |
+
//Number - Width of the grid lines
|
20 |
+
scaleGridLineWidth : 1,
|
21 |
+
|
22 |
+
//Boolean - If there is a stroke on each bar
|
23 |
+
barShowStroke : true,
|
24 |
+
|
25 |
+
//Number - Pixel width of the bar stroke
|
26 |
+
barStrokeWidth : 2,
|
27 |
+
|
28 |
+
//Number - Spacing between each of the X value sets
|
29 |
+
barValueSpacing : 5,
|
30 |
+
|
31 |
+
//Number - Spacing between data sets within X values
|
32 |
+
barDatasetSpacing : 1,
|
33 |
+
|
34 |
+
//String - A legend template
|
35 |
+
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].fillColor%>\"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>"
|
36 |
+
|
37 |
+
};
|
38 |
+
|
39 |
+
|
40 |
+
Chart.Type.extend({
|
41 |
+
name: "Bar",
|
42 |
+
defaults : defaultConfig,
|
43 |
+
initialize: function(data){
|
44 |
+
|
45 |
+
//Expose options as a scope variable here so we can access it in the ScaleClass
|
46 |
+
var options = this.options;
|
47 |
+
|
48 |
+
this.ScaleClass = Chart.Scale.extend({
|
49 |
+
offsetGridLines : true,
|
50 |
+
calculateBarX : function(datasetCount, datasetIndex, barIndex){
|
51 |
+
//Reusable method for calculating the xPosition of a given bar based on datasetIndex & width of the bar
|
52 |
+
var xWidth = this.calculateBaseWidth(),
|
53 |
+
xAbsolute = this.calculateX(barIndex) - (xWidth/2),
|
54 |
+
barWidth = this.calculateBarWidth(datasetCount);
|
55 |
+
|
56 |
+
return xAbsolute + (barWidth * datasetIndex) + (datasetIndex * options.barDatasetSpacing) + barWidth/2;
|
57 |
+
},
|
58 |
+
calculateBaseWidth : function(){
|
59 |
+
return (this.calculateX(1) - this.calculateX(0)) - (2*options.barValueSpacing);
|
60 |
+
},
|
61 |
+
calculateBarWidth : function(datasetCount){
|
62 |
+
//The padding between datasets is to the right of each bar, providing that there are more than 1 dataset
|
63 |
+
var baseWidth = this.calculateBaseWidth() - ((datasetCount - 1) * options.barDatasetSpacing);
|
64 |
+
|
65 |
+
return (baseWidth / datasetCount);
|
66 |
+
}
|
67 |
+
});
|
68 |
+
|
69 |
+
this.datasets = [];
|
70 |
+
|
71 |
+
//Set up tooltip events on the chart
|
72 |
+
if (this.options.showTooltips){
|
73 |
+
helpers.bindEvents(this, this.options.tooltipEvents, function(evt){
|
74 |
+
var activeBars = (evt.type !== 'mouseout') ? this.getBarsAtEvent(evt) : [];
|
75 |
+
|
76 |
+
this.eachBars(function(bar){
|
77 |
+
bar.restore(['fillColor', 'strokeColor']);
|
78 |
+
});
|
79 |
+
helpers.each(activeBars, function(activeBar){
|
80 |
+
activeBar.fillColor = activeBar.highlightFill;
|
81 |
+
activeBar.strokeColor = activeBar.highlightStroke;
|
82 |
+
});
|
83 |
+
this.showTooltip(activeBars);
|
84 |
+
});
|
85 |
+
}
|
86 |
+
|
87 |
+
//Declare the extension of the default point, to cater for the options passed in to the constructor
|
88 |
+
this.BarClass = Chart.Rectangle.extend({
|
89 |
+
strokeWidth : this.options.barStrokeWidth,
|
90 |
+
showStroke : this.options.barShowStroke,
|
91 |
+
ctx : this.chart.ctx
|
92 |
+
});
|
93 |
+
|
94 |
+
//Iterate through each of the datasets, and build this into a property of the chart
|
95 |
+
helpers.each(data.datasets,function(dataset,datasetIndex){
|
96 |
+
|
97 |
+
var datasetObject = {
|
98 |
+
label : dataset.label || null,
|
99 |
+
fillColor : dataset.fillColor,
|
100 |
+
strokeColor : dataset.strokeColor,
|
101 |
+
bars : []
|
102 |
+
};
|
103 |
+
|
104 |
+
this.datasets.push(datasetObject);
|
105 |
+
|
106 |
+
helpers.each(dataset.data,function(dataPoint,index){
|
107 |
+
//Add a new point for each piece of data, passing any required data to draw.
|
108 |
+
datasetObject.bars.push(new this.BarClass({
|
109 |
+
value : dataPoint,
|
110 |
+
label : data.labels[index],
|
111 |
+
datasetLabel: dataset.label,
|
112 |
+
strokeColor : dataset.strokeColor,
|
113 |
+
fillColor : dataset.fillColor,
|
114 |
+
highlightFill : dataset.highlightFill || dataset.fillColor,
|
115 |
+
highlightStroke : dataset.highlightStroke || dataset.strokeColor
|
116 |
+
}));
|
117 |
+
},this);
|
118 |
+
|
119 |
+
},this);
|
120 |
+
|
121 |
+
this.buildScale(data.labels);
|
122 |
+
|
123 |
+
this.BarClass.prototype.base = this.scale.endPoint;
|
124 |
+
|
125 |
+
this.eachBars(function(bar, index, datasetIndex){
|
126 |
+
helpers.extend(bar, {
|
127 |
+
width : this.scale.calculateBarWidth(this.datasets.length),
|
128 |
+
x: this.scale.calculateBarX(this.datasets.length, datasetIndex, index),
|
129 |
+
y: this.scale.endPoint
|
130 |
+
});
|
131 |
+
bar.save();
|
132 |
+
}, this);
|
133 |
+
|
134 |
+
this.render();
|
135 |
+
},
|
136 |
+
update : function(){
|
137 |
+
this.scale.update();
|
138 |
+
// Reset any highlight colours before updating.
|
139 |
+
helpers.each(this.activeElements, function(activeElement){
|
140 |
+
activeElement.restore(['fillColor', 'strokeColor']);
|
141 |
+
});
|
142 |
+
|
143 |
+
this.eachBars(function(bar){
|
144 |
+
bar.save();
|
145 |
+
});
|
146 |
+
this.render();
|
147 |
+
},
|
148 |
+
eachBars : function(callback){
|
149 |
+
helpers.each(this.datasets,function(dataset, datasetIndex){
|
150 |
+
helpers.each(dataset.bars, callback, this, datasetIndex);
|
151 |
+
},this);
|
152 |
+
},
|
153 |
+
getBarsAtEvent : function(e){
|
154 |
+
var barsArray = [],
|
155 |
+
eventPosition = helpers.getRelativePosition(e),
|
156 |
+
datasetIterator = function(dataset){
|
157 |
+
barsArray.push(dataset.bars[barIndex]);
|
158 |
+
},
|
159 |
+
barIndex;
|
160 |
+
|
161 |
+
for (var datasetIndex = 0; datasetIndex < this.datasets.length; datasetIndex++) {
|
162 |
+
for (barIndex = 0; barIndex < this.datasets[datasetIndex].bars.length; barIndex++) {
|
163 |
+
if (this.datasets[datasetIndex].bars[barIndex].inRange(eventPosition.x,eventPosition.y)){
|
164 |
+
helpers.each(this.datasets, datasetIterator);
|
165 |
+
return barsArray;
|
166 |
+
}
|
167 |
+
}
|
168 |
+
}
|
169 |
+
|
170 |
+
return barsArray;
|
171 |
+
},
|
172 |
+
buildScale : function(labels){
|
173 |
+
var self = this;
|
174 |
+
|
175 |
+
var dataTotal = function(){
|
176 |
+
var values = [];
|
177 |
+
self.eachBars(function(bar){
|
178 |
+
values.push(bar.value);
|
179 |
+
});
|
180 |
+
return values;
|
181 |
+
};
|
182 |
+
|
183 |
+
var scaleOptions = {
|
184 |
+
templateString : this.options.scaleLabel,
|
185 |
+
height : this.chart.height,
|
186 |
+
width : this.chart.width,
|
187 |
+
ctx : this.chart.ctx,
|
188 |
+
textColor : this.options.scaleFontColor,
|
189 |
+
fontSize : this.options.scaleFontSize,
|
190 |
+
fontStyle : this.options.scaleFontStyle,
|
191 |
+
fontFamily : this.options.scaleFontFamily,
|
192 |
+
valuesCount : labels.length,
|
193 |
+
beginAtZero : this.options.scaleBeginAtZero,
|
194 |
+
integersOnly : this.options.scaleIntegersOnly,
|
195 |
+
calculateYRange: function(currentHeight){
|
196 |
+
var updatedRanges = helpers.calculateScaleRange(
|
197 |
+
dataTotal(),
|
198 |
+
currentHeight,
|
199 |
+
this.fontSize,
|
200 |
+
this.beginAtZero,
|
201 |
+
this.integersOnly
|
202 |
+
);
|
203 |
+
helpers.extend(this, updatedRanges);
|
204 |
+
},
|
205 |
+
xLabels : labels,
|
206 |
+
font : helpers.fontString(this.options.scaleFontSize, this.options.scaleFontStyle, this.options.scaleFontFamily),
|
207 |
+
lineWidth : this.options.scaleLineWidth,
|
208 |
+
lineColor : this.options.scaleLineColor,
|
209 |
+
gridLineWidth : (this.options.scaleShowGridLines) ? this.options.scaleGridLineWidth : 0,
|
210 |
+
gridLineColor : (this.options.scaleShowGridLines) ? this.options.scaleGridLineColor : "rgba(0,0,0,0)",
|
211 |
+
padding : (this.options.showScale) ? 0 : (this.options.barShowStroke) ? this.options.barStrokeWidth : 0,
|
212 |
+
showLabels : this.options.scaleShowLabels,
|
213 |
+
display : this.options.showScale
|
214 |
+
};
|
215 |
+
|
216 |
+
if (this.options.scaleOverride){
|
217 |
+
helpers.extend(scaleOptions, {
|
218 |
+
calculateYRange: helpers.noop,
|
219 |
+
steps: this.options.scaleSteps,
|
220 |
+
stepValue: this.options.scaleStepWidth,
|
221 |
+
min: this.options.scaleStartValue,
|
222 |
+
max: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth)
|
223 |
+
});
|
224 |
+
}
|
225 |
+
|
226 |
+
this.scale = new this.ScaleClass(scaleOptions);
|
227 |
+
},
|
228 |
+
addData : function(valuesArray,label){
|
229 |
+
//Map the values array for each of the datasets
|
230 |
+
helpers.each(valuesArray,function(value,datasetIndex){
|
231 |
+
//Add a new point for each piece of data, passing any required data to draw.
|
232 |
+
this.datasets[datasetIndex].bars.push(new this.BarClass({
|
233 |
+
value : value,
|
234 |
+
label : label,
|
235 |
+
x: this.scale.calculateBarX(this.datasets.length, datasetIndex, this.scale.valuesCount+1),
|
236 |
+
y: this.scale.endPoint,
|
237 |
+
width : this.scale.calculateBarWidth(this.datasets.length),
|
238 |
+
base : this.scale.endPoint,
|
239 |
+
strokeColor : this.datasets[datasetIndex].strokeColor,
|
240 |
+
fillColor : this.datasets[datasetIndex].fillColor
|
241 |
+
}));
|
242 |
+
},this);
|
243 |
+
|
244 |
+
this.scale.addXLabel(label);
|
245 |
+
//Then re-render the chart.
|
246 |
+
this.update();
|
247 |
+
},
|
248 |
+
removeData : function(){
|
249 |
+
this.scale.removeXLabel();
|
250 |
+
//Then re-render the chart.
|
251 |
+
helpers.each(this.datasets,function(dataset){
|
252 |
+
dataset.bars.shift();
|
253 |
+
},this);
|
254 |
+
this.update();
|
255 |
+
},
|
256 |
+
reflow : function(){
|
257 |
+
helpers.extend(this.BarClass.prototype,{
|
258 |
+
y: this.scale.endPoint,
|
259 |
+
base : this.scale.endPoint
|
260 |
+
});
|
261 |
+
var newScaleProps = helpers.extend({
|
262 |
+
height : this.chart.height,
|
263 |
+
width : this.chart.width
|
264 |
+
});
|
265 |
+
this.scale.update(newScaleProps);
|
266 |
+
},
|
267 |
+
draw : function(ease){
|
268 |
+
var easingDecimal = ease || 1;
|
269 |
+
this.clear();
|
270 |
+
|
271 |
+
var ctx = this.chart.ctx;
|
272 |
+
|
273 |
+
this.scale.draw(easingDecimal);
|
274 |
+
|
275 |
+
//Draw all the bars for each dataset
|
276 |
+
helpers.each(this.datasets,function(dataset,datasetIndex){
|
277 |
+
helpers.each(dataset.bars,function(bar,index){
|
278 |
+
if (bar.hasValue()){
|
279 |
+
bar.base = this.scale.endPoint;
|
280 |
+
//Transition then draw
|
281 |
+
bar.transition({
|
282 |
+
x : this.scale.calculateBarX(this.datasets.length, datasetIndex, index),
|
283 |
+
y : this.scale.calculateY(bar.value),
|
284 |
+
width : this.scale.calculateBarWidth(this.datasets.length)
|
285 |
+
}, easingDecimal).draw();
|
286 |
+
}
|
287 |
+
},this);
|
288 |
+
|
289 |
+
},this);
|
290 |
+
}
|
291 |
+
});
|
292 |
+
|
293 |
+
|
294 |
+
}).call(this);
|
lib/Chart_js/src/Chart.Core.js
ADDED
@@ -0,0 +1,1943 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*!
|
2 |
+
* Chart.js
|
3 |
+
* http://chartjs.org/
|
4 |
+
* Version: {{ version }}
|
5 |
+
*
|
6 |
+
* Copyright 2014 Nick Downie
|
7 |
+
* Released under the MIT license
|
8 |
+
* https://github.com/nnnick/Chart.js/blob/master/LICENSE.md
|
9 |
+
*/
|
10 |
+
|
11 |
+
|
12 |
+
(function(){
|
13 |
+
|
14 |
+
"use strict";
|
15 |
+
|
16 |
+
//Declare root variable - window in the browser, global on the server
|
17 |
+
var root = this,
|
18 |
+
previous = root.Chart;
|
19 |
+
|
20 |
+
//Occupy the global variable of Chart, and create a simple base class
|
21 |
+
var Chart = function(context){
|
22 |
+
var chart = this;
|
23 |
+
this.canvas = context.canvas;
|
24 |
+
|
25 |
+
this.ctx = context;
|
26 |
+
|
27 |
+
//Variables global to the chart
|
28 |
+
var width = this.width = context.canvas.width;
|
29 |
+
var height = this.height = context.canvas.height;
|
30 |
+
this.aspectRatio = this.width / this.height;
|
31 |
+
//High pixel density displays - multiply the size of the canvas height/width by the device pixel ratio, then scale.
|
32 |
+
helpers.retinaScale(this);
|
33 |
+
|
34 |
+
return this;
|
35 |
+
};
|
36 |
+
//Globally expose the defaults to allow for user updating/changing
|
37 |
+
Chart.defaults = {
|
38 |
+
global: {
|
39 |
+
// Boolean - Whether to animate the chart
|
40 |
+
animation: true,
|
41 |
+
|
42 |
+
// Number - Number of animation steps
|
43 |
+
animationSteps: 60,
|
44 |
+
|
45 |
+
// String - Animation easing effect
|
46 |
+
animationEasing: "easeOutQuart",
|
47 |
+
|
48 |
+
// Boolean - If we should show the scale at all
|
49 |
+
showScale: true,
|
50 |
+
|
51 |
+
// Boolean - If we want to override with a hard coded scale
|
52 |
+
scaleOverride: false,
|
53 |
+
|
54 |
+
// ** Required if scaleOverride is true **
|
55 |
+
// Number - The number of steps in a hard coded scale
|
56 |
+
scaleSteps: null,
|
57 |
+
// Number - The value jump in the hard coded scale
|
58 |
+
scaleStepWidth: null,
|
59 |
+
// Number - The scale starting value
|
60 |
+
scaleStartValue: null,
|
61 |
+
|
62 |
+
// String - Colour of the scale line
|
63 |
+
scaleLineColor: "rgba(0,0,0,.1)",
|
64 |
+
|
65 |
+
// Number - Pixel width of the scale line
|
66 |
+
scaleLineWidth: 1,
|
67 |
+
|
68 |
+
// Boolean - Whether to show labels on the scale
|
69 |
+
scaleShowLabels: true,
|
70 |
+
|
71 |
+
// Interpolated JS string - can access value
|
72 |
+
scaleLabel: "<%=value%>",
|
73 |
+
|
74 |
+
// Boolean - Whether the scale should stick to integers, and not show any floats even if drawing space is there
|
75 |
+
scaleIntegersOnly: true,
|
76 |
+
|
77 |
+
// Boolean - Whether the scale should start at zero, or an order of magnitude down from the lowest value
|
78 |
+
scaleBeginAtZero: false,
|
79 |
+
|
80 |
+
// String - Scale label font declaration for the scale label
|
81 |
+
scaleFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",
|
82 |
+
|
83 |
+
// Number - Scale label font size in pixels
|
84 |
+
scaleFontSize: 12,
|
85 |
+
|
86 |
+
// String - Scale label font weight style
|
87 |
+
scaleFontStyle: "normal",
|
88 |
+
|
89 |
+
// String - Scale label font colour
|
90 |
+
scaleFontColor: "#666",
|
91 |
+
|
92 |
+
// Boolean - whether or not the chart should be responsive and resize when the browser does.
|
93 |
+
responsive: false,
|
94 |
+
|
95 |
+
// Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container
|
96 |
+
maintainAspectRatio: true,
|
97 |
+
|
98 |
+
// Boolean - Determines whether to draw tooltips on the canvas or not - attaches events to touchmove & mousemove
|
99 |
+
showTooltips: true,
|
100 |
+
|
101 |
+
// Array - Array of string names to attach tooltip events
|
102 |
+
tooltipEvents: ["mousemove", "touchstart", "touchmove", "mouseout"],
|
103 |
+
|
104 |
+
// String - Tooltip background colour
|
105 |
+
tooltipFillColor: "rgba(0,0,0,0.8)",
|
106 |
+
|
107 |
+
// String - Tooltip label font declaration for the scale label
|
108 |
+
tooltipFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",
|
109 |
+
|
110 |
+
// Number - Tooltip label font size in pixels
|
111 |
+
tooltipFontSize: 14,
|
112 |
+
|
113 |
+
// String - Tooltip font weight style
|
114 |
+
tooltipFontStyle: "normal",
|
115 |
+
|
116 |
+
// String - Tooltip label font colour
|
117 |
+
tooltipFontColor: "#fff",
|
118 |
+
|
119 |
+
// String - Tooltip title font declaration for the scale label
|
120 |
+
tooltipTitleFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",
|
121 |
+
|
122 |
+
// Number - Tooltip title font size in pixels
|
123 |
+
tooltipTitleFontSize: 14,
|
124 |
+
|
125 |
+
// String - Tooltip title font weight style
|
126 |
+
tooltipTitleFontStyle: "bold",
|
127 |
+
|
128 |
+
// String - Tooltip title font colour
|
129 |
+
tooltipTitleFontColor: "#fff",
|
130 |
+
|
131 |
+
// Number - pixel width of padding around tooltip text
|
132 |
+
tooltipYPadding: 6,
|
133 |
+
|
134 |
+
// Number - pixel width of padding around tooltip text
|
135 |
+
tooltipXPadding: 6,
|
136 |
+
|
137 |
+
// Number - Size of the caret on the tooltip
|
138 |
+
tooltipCaretSize: 8,
|
139 |
+
|
140 |
+
// Number - Pixel radius of the tooltip border
|
141 |
+
tooltipCornerRadius: 6,
|
142 |
+
|
143 |
+
// Number - Pixel offset from point x to tooltip edge
|
144 |
+
tooltipXOffset: 10,
|
145 |
+
|
146 |
+
// String - Template string for single tooltips
|
147 |
+
tooltipTemplate: "<%if (label){%><%=label%>: <%}%><%= value %>",
|
148 |
+
|
149 |
+
// String - Template string for single tooltips
|
150 |
+
multiTooltipTemplate: "<%= value %>",
|
151 |
+
|
152 |
+
// String - Colour behind the legend colour block
|
153 |
+
multiTooltipKeyBackground: '#fff',
|
154 |
+
|
155 |
+
// Function - Will fire on animation progression.
|
156 |
+
onAnimationProgress: function(){},
|
157 |
+
|
158 |
+
// Function - Will fire on animation completion.
|
159 |
+
onAnimationComplete: function(){}
|
160 |
+
|
161 |
+
}
|
162 |
+
};
|
163 |
+
|
164 |
+
//Create a dictionary of chart types, to allow for extension of existing types
|
165 |
+
Chart.types = {};
|
166 |
+
|
167 |
+
//Global Chart helpers object for utility methods and classes
|
168 |
+
var helpers = Chart.helpers = {};
|
169 |
+
|
170 |
+
//-- Basic js utility methods
|
171 |
+
var each = helpers.each = function(loopable,callback,self){
|
172 |
+
var additionalArgs = Array.prototype.slice.call(arguments, 3);
|
173 |
+
// Check to see if null or undefined firstly.
|
174 |
+
if (loopable){
|
175 |
+
if (loopable.length === +loopable.length){
|
176 |
+
var i;
|
177 |
+
for (i=0; i<loopable.length; i++){
|
178 |
+
callback.apply(self,[loopable[i], i].concat(additionalArgs));
|
179 |
+
}
|
180 |
+
}
|
181 |
+
else{
|
182 |
+
for (var item in loopable){
|
183 |
+
callback.apply(self,[loopable[item],item].concat(additionalArgs));
|
184 |
+
}
|
185 |
+
}
|
186 |
+
}
|
187 |
+
},
|
188 |
+
clone = helpers.clone = function(obj){
|
189 |
+
var objClone = {};
|
190 |
+
each(obj,function(value,key){
|
191 |
+
if (obj.hasOwnProperty(key)) objClone[key] = value;
|
192 |
+
});
|
193 |
+
return objClone;
|
194 |
+
},
|
195 |
+
extend = helpers.extend = function(base){
|
196 |
+
each(Array.prototype.slice.call(arguments,1), function(extensionObject) {
|
197 |
+
each(extensionObject,function(value,key){
|
198 |
+
if (extensionObject.hasOwnProperty(key)) base[key] = value;
|
199 |
+
});
|
200 |
+
});
|
201 |
+
return base;
|
202 |
+
},
|
203 |
+
merge = helpers.merge = function(base,master){
|
204 |
+
//Merge properties in left object over to a shallow clone of object right.
|
205 |
+
var args = Array.prototype.slice.call(arguments,0);
|
206 |
+
args.unshift({});
|
207 |
+
return extend.apply(null, args);
|
208 |
+
},
|
209 |
+
indexOf = helpers.indexOf = function(arrayToSearch, item){
|
210 |
+
if (Array.prototype.indexOf) {
|
211 |
+
return arrayToSearch.indexOf(item);
|
212 |
+
}
|
213 |
+
else{
|
214 |
+
for (var i = 0; i < arrayToSearch.length; i++) {
|
215 |
+
if (arrayToSearch[i] === item) return i;
|
216 |
+
}
|
217 |
+
return -1;
|
218 |
+
}
|
219 |
+
},
|
220 |
+
where = helpers.where = function(collection, filterCallback){
|
221 |
+
var filtered = [];
|
222 |
+
|
223 |
+
helpers.each(collection, function(item){
|
224 |
+
if (filterCallback(item)){
|
225 |
+
filtered.push(item);
|
226 |
+
}
|
227 |
+
});
|
228 |
+
|
229 |
+
return filtered;
|
230 |
+
},
|
231 |
+
findNextWhere = helpers.findNextWhere = function(arrayToSearch, filterCallback, startIndex){
|
232 |
+
// Default to start of the array
|
233 |
+
if (!startIndex){
|
234 |
+
startIndex = -1;
|
235 |
+
}
|
236 |
+
for (var i = startIndex + 1; i < arrayToSearch.length; i++) {
|
237 |
+
var currentItem = arrayToSearch[i];
|
238 |
+
if (filterCallback(currentItem)){
|
239 |
+
return currentItem;
|
240 |
+
}
|
241 |
+
};
|
242 |
+
},
|
243 |
+
findPreviousWhere = helpers.findPreviousWhere = function(arrayToSearch, filterCallback, startIndex){
|
244 |
+
// Default to end of the array
|
245 |
+
if (!startIndex){
|
246 |
+
startIndex = arrayToSearch.length;
|
247 |
+
}
|
248 |
+
for (var i = startIndex - 1; i >= 0; i--) {
|
249 |
+
var currentItem = arrayToSearch[i];
|
250 |
+
if (filterCallback(currentItem)){
|
251 |
+
return currentItem;
|
252 |
+
}
|
253 |
+
};
|
254 |
+
},
|
255 |
+
inherits = helpers.inherits = function(extensions){
|
256 |
+
//Basic javascript inheritance based on the model created in Backbone.js
|
257 |
+
var parent = this;
|
258 |
+
var ChartElement = (extensions && extensions.hasOwnProperty("constructor")) ? extensions.constructor : function(){ return parent.apply(this, arguments); };
|
259 |
+
|
260 |
+
var Surrogate = function(){ this.constructor = ChartElement;};
|
261 |
+
Surrogate.prototype = parent.prototype;
|
262 |
+
ChartElement.prototype = new Surrogate();
|
263 |
+
|
264 |
+
ChartElement.extend = inherits;
|
265 |
+
|
266 |
+
if (extensions) extend(ChartElement.prototype, extensions);
|
267 |
+
|
268 |
+
ChartElement.__super__ = parent.prototype;
|
269 |
+
|
270 |
+
return ChartElement;
|
271 |
+
},
|
272 |
+
noop = helpers.noop = function(){},
|
273 |
+
uid = helpers.uid = (function(){
|
274 |
+
var id=0;
|
275 |
+
return function(){
|
276 |
+
return "chart-" + id++;
|
277 |
+
};
|
278 |
+
})(),
|
279 |
+
warn = helpers.warn = function(str){
|
280 |
+
//Method for warning of errors
|
281 |
+
if (window.console && typeof window.console.warn == "function") console.warn(str);
|
282 |
+
},
|
283 |
+
amd = helpers.amd = (typeof define == 'function' && define.amd),
|
284 |
+
//-- Math methods
|
285 |
+
isNumber = helpers.isNumber = function(n){
|
286 |
+
return !isNaN(parseFloat(n)) && isFinite(n);
|
287 |
+
},
|
288 |
+
max = helpers.max = function(array){
|
289 |
+
return Math.max.apply( Math, array );
|
290 |
+
},
|
291 |
+
min = helpers.min = function(array){
|
292 |
+
return Math.min.apply( Math, array );
|
293 |
+
},
|
294 |
+
cap = helpers.cap = function(valueToCap,maxValue,minValue){
|
295 |
+
if(isNumber(maxValue)) {
|
296 |
+
if( valueToCap > maxValue ) {
|
297 |
+
return maxValue;
|
298 |
+
}
|
299 |
+
}
|
300 |
+
else if(isNumber(minValue)){
|
301 |
+
if ( valueToCap < minValue ){
|
302 |
+
return minValue;
|
303 |
+
}
|
304 |
+
}
|
305 |
+
return valueToCap;
|
306 |
+
},
|
307 |
+
getDecimalPlaces = helpers.getDecimalPlaces = function(num){
|
308 |
+
if (num%1!==0 && isNumber(num)){
|
309 |
+
return num.toString().split(".")[1].length;
|
310 |
+
}
|
311 |
+
else {
|
312 |
+
return 0;
|
313 |
+
}
|
314 |
+
},
|
315 |
+
toRadians = helpers.radians = function(degrees){
|
316 |
+
return degrees * (Math.PI/180);
|
317 |
+
},
|
318 |
+
// Gets the angle from vertical upright to the point about a centre.
|
319 |
+
getAngleFromPoint = helpers.getAngleFromPoint = function(centrePoint, anglePoint){
|
320 |
+
var distanceFromXCenter = anglePoint.x - centrePoint.x,
|
321 |
+
distanceFromYCenter = anglePoint.y - centrePoint.y,
|
322 |
+
radialDistanceFromCenter = Math.sqrt( distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);
|
323 |
+
|
324 |
+
|
325 |
+
var angle = Math.PI * 2 + Math.atan2(distanceFromYCenter, distanceFromXCenter);
|
326 |
+
|
327 |
+
//If the segment is in the top left quadrant, we need to add another rotation to the angle
|
328 |
+
if (distanceFromXCenter < 0 && distanceFromYCenter < 0){
|
329 |
+
angle += Math.PI*2;
|
330 |
+
}
|
331 |
+
|
332 |
+
return {
|
333 |
+
angle: angle,
|
334 |
+
distance: radialDistanceFromCenter
|
335 |
+
};
|
336 |
+
},
|
337 |
+
aliasPixel = helpers.aliasPixel = function(pixelWidth){
|
338 |
+
return (pixelWidth % 2 === 0) ? 0 : 0.5;
|
339 |
+
},
|
340 |
+
splineCurve = helpers.splineCurve = function(FirstPoint,MiddlePoint,AfterPoint,t){
|
341 |
+
//Props to Rob Spencer at scaled innovation for his post on splining between points
|
342 |
+
//http://scaledinnovation.com/analytics/splines/aboutSplines.html
|
343 |
+
var d01=Math.sqrt(Math.pow(MiddlePoint.x-FirstPoint.x,2)+Math.pow(MiddlePoint.y-FirstPoint.y,2)),
|
344 |
+
d12=Math.sqrt(Math.pow(AfterPoint.x-MiddlePoint.x,2)+Math.pow(AfterPoint.y-MiddlePoint.y,2)),
|
345 |
+
fa=t*d01/(d01+d12),// scaling factor for triangle Ta
|
346 |
+
fb=t*d12/(d01+d12);
|
347 |
+
return {
|
348 |
+
inner : {
|
349 |
+
x : MiddlePoint.x-fa*(AfterPoint.x-FirstPoint.x),
|
350 |
+
y : MiddlePoint.y-fa*(AfterPoint.y-FirstPoint.y)
|
351 |
+
},
|
352 |
+
outer : {
|
353 |
+
x: MiddlePoint.x+fb*(AfterPoint.x-FirstPoint.x),
|
354 |
+
y : MiddlePoint.y+fb*(AfterPoint.y-FirstPoint.y)
|
355 |
+
}
|
356 |
+
};
|
357 |
+
},
|
358 |
+
calculateOrderOfMagnitude = helpers.calculateOrderOfMagnitude = function(val){
|
359 |
+
return Math.floor(Math.log(val) / Math.LN10);
|
360 |
+
},
|
361 |
+
calculateScaleRange = helpers.calculateScaleRange = function(valuesArray, drawingSize, textSize, startFromZero, integersOnly){
|
362 |
+
|
363 |
+
//Set a minimum step of two - a point at the top of the graph, and a point at the base
|
364 |
+
var minSteps = 2,
|
365 |
+
maxSteps = Math.floor(drawingSize/(textSize * 1.5)),
|
366 |
+
skipFitting = (minSteps >= maxSteps);
|
367 |
+
|
368 |
+
var maxValue = max(valuesArray),
|
369 |
+
minValue = min(valuesArray);
|
370 |
+
|
371 |
+
// We need some degree of seperation here to calculate the scales if all the values are the same
|
372 |
+
// Adding/minusing 0.5 will give us a range of 1.
|
373 |
+
if (maxValue === minValue){
|
374 |
+
maxValue += 0.5;
|
375 |
+
// So we don't end up with a graph with a negative start value if we've said always start from zero
|
376 |
+
if (minValue >= 0.5 && !startFromZero){
|
377 |
+
minValue -= 0.5;
|
378 |
+
}
|
379 |
+
else{
|
380 |
+
// Make up a whole number above the values
|
381 |
+
maxValue += 0.5;
|
382 |
+
}
|
383 |
+
}
|
384 |
+
|
385 |
+
var valueRange = Math.abs(maxValue - minValue),
|
386 |
+
rangeOrderOfMagnitude = calculateOrderOfMagnitude(valueRange),
|
387 |
+
graphMax = Math.ceil(maxValue / (1 * Math.pow(10, rangeOrderOfMagnitude))) * Math.pow(10, rangeOrderOfMagnitude),
|
388 |
+
graphMin = (startFromZero) ? 0 : Math.floor(minValue / (1 * Math.pow(10, rangeOrderOfMagnitude))) * Math.pow(10, rangeOrderOfMagnitude),
|
389 |
+
graphRange = graphMax - graphMin,
|
390 |
+
stepValue = Math.pow(10, rangeOrderOfMagnitude),
|
391 |
+
numberOfSteps = Math.round(graphRange / stepValue);
|
392 |
+
|
393 |
+
//If we have more space on the graph we'll use it to give more definition to the data
|
394 |
+
while((numberOfSteps > maxSteps || (numberOfSteps * 2) < maxSteps) && !skipFitting) {
|
395 |
+
if(numberOfSteps > maxSteps){
|
396 |
+
stepValue *=2;
|
397 |
+
numberOfSteps = Math.round(graphRange/stepValue);
|
398 |
+
// Don't ever deal with a decimal number of steps - cancel fitting and just use the minimum number of steps.
|
399 |
+
if (numberOfSteps % 1 !== 0){
|
400 |
+
skipFitting = true;
|
401 |
+
}
|
402 |
+
}
|
403 |
+
//We can fit in double the amount of scale points on the scale
|
404 |
+
else{
|
405 |
+
//If user has declared ints only, and the step value isn't a decimal
|
406 |
+
if (integersOnly && rangeOrderOfMagnitude >= 0){
|
407 |
+
//If the user has said integers only, we need to check that making the scale more granular wouldn't make it a float
|
408 |
+
if(stepValue/2 % 1 === 0){
|
409 |
+
stepValue /=2;
|
410 |
+
numberOfSteps = Math.round(graphRange/stepValue);
|
411 |
+
}
|
412 |
+
//If it would make it a float break out of the loop
|
413 |
+
else{
|
414 |
+
break;
|
415 |
+
}
|
416 |
+
}
|
417 |
+
//If the scale doesn't have to be an int, make the scale more granular anyway.
|
418 |
+
else{
|
419 |
+
stepValue /=2;
|
420 |
+
numberOfSteps = Math.round(graphRange/stepValue);
|
421 |
+
}
|
422 |
+
|
423 |
+
}
|
424 |
+
}
|
425 |
+
|
426 |
+
if (skipFitting){
|
427 |
+
numberOfSteps = minSteps;
|
428 |
+
stepValue = graphRange / numberOfSteps;
|
429 |
+
}
|
430 |
+
|
431 |
+
return {
|
432 |
+
steps : numberOfSteps,
|
433 |
+
stepValue : stepValue,
|
434 |
+
min : graphMin,
|
435 |
+
max : graphMin + (numberOfSteps * stepValue)
|
436 |
+
};
|
437 |
+
|
438 |
+
},
|
439 |
+
/* jshint ignore:start */
|
440 |
+
// Blows up jshint errors based on the new Function constructor
|
441 |
+
//Templating methods
|
442 |
+
//Javascript micro templating by John Resig - source at http://ejohn.org/blog/javascript-micro-templating/
|
443 |
+
template = helpers.template = function(templateString, valuesObject){
|
444 |
+
// If templateString is function rather than string-template - call the function for valuesObject
|
445 |
+
if(templateString instanceof Function){
|
446 |
+
return templateString(valuesObject);
|
447 |
+
}
|
448 |
+
|
449 |
+
var cache = {};
|
450 |
+
function tmpl(str, data){
|
451 |
+
// Figure out if we're getting a template, or if we need to
|
452 |
+
// load the template - and be sure to cache the result.
|
453 |
+
var fn = !/\W/.test(str) ?
|
454 |
+
cache[str] = cache[str] :
|
455 |
+
|
456 |
+
// Generate a reusable function that will serve as a template
|
457 |
+
// generator (and which will be cached).
|
458 |
+
new Function("obj",
|
459 |
+
"var p=[],print=function(){p.push.apply(p,arguments);};" +
|
460 |
+
|
461 |
+
// Introduce the data as local variables using with(){}
|
462 |
+
"with(obj){p.push('" +
|
463 |
+
|
464 |
+
// Convert the template into pure JavaScript
|
465 |
+
str
|
466 |
+
.replace(/[\r\t\n]/g, " ")
|
467 |
+
.split("<%").join("\t")
|
468 |
+
.replace(/((^|%>)[^\t]*)'/g, "$1\r")
|
469 |
+
.replace(/\t=(.*?)%>/g, "',$1,'")
|
470 |
+
.split("\t").join("');")
|
471 |
+
.split("%>").join("p.push('")
|
472 |
+
.split("\r").join("\\'") +
|
473 |
+
"');}return p.join('');"
|
474 |
+
);
|
475 |
+
|
476 |
+
// Provide some basic currying to the user
|
477 |
+
return data ? fn( data ) : fn;
|
478 |
+
}
|
479 |
+
return tmpl(templateString,valuesObject);
|
480 |
+
},
|
481 |
+
/* jshint ignore:end */
|
482 |
+
generateLabels = helpers.generateLabels = function(templateString,numberOfSteps,graphMin,stepValue){
|
483 |
+
var labelsArray = new Array(numberOfSteps);
|
484 |
+
if (labelTemplateString){
|
485 |
+
each(labelsArray,function(val,index){
|
486 |
+
labelsArray[index] = template(templateString,{value: (graphMin + (stepValue*(index+1)))});
|
487 |
+
});
|
488 |
+
}
|
489 |
+
return labelsArray;
|
490 |
+
},
|
491 |
+
//--Animation methods
|
492 |
+
//Easing functions adapted from Robert Penner's easing equations
|
493 |
+
//http://www.robertpenner.com/easing/
|
494 |
+
easingEffects = helpers.easingEffects = {
|
495 |
+
linear: function (t) {
|
496 |
+
return t;
|
497 |
+
},
|
498 |
+
easeInQuad: function (t) {
|
499 |
+
return t * t;
|
500 |
+
},
|
501 |
+
easeOutQuad: function (t) {
|
502 |
+
return -1 * t * (t - 2);
|
503 |
+
},
|
504 |
+
easeInOutQuad: function (t) {
|
505 |
+
if ((t /= 1 / 2) < 1) return 1 / 2 * t * t;
|
506 |
+
return -1 / 2 * ((--t) * (t - 2) - 1);
|
507 |
+
},
|
508 |
+
easeInCubic: function (t) {
|
509 |
+
return t * t * t;
|
510 |
+
},
|
511 |
+
easeOutCubic: function (t) {
|
512 |
+
return 1 * ((t = t / 1 - 1) * t * t + 1);
|
513 |
+
},
|
514 |
+
easeInOutCubic: function (t) {
|
515 |
+
if ((t /= 1 / 2) < 1) return 1 / 2 * t * t * t;
|
516 |
+
return 1 / 2 * ((t -= 2) * t * t + 2);
|
517 |
+
},
|
518 |
+
easeInQuart: function (t) {
|
519 |
+
return t * t * t * t;
|
520 |
+
},
|
521 |
+
easeOutQuart: function (t) {
|
522 |
+
return -1 * ((t = t / 1 - 1) * t * t * t - 1);
|
523 |
+
},
|
524 |
+
easeInOutQuart: function (t) {
|
525 |
+
if ((t /= 1 / 2) < 1) return 1 / 2 * t * t * t * t;
|
526 |
+
return -1 / 2 * ((t -= 2) * t * t * t - 2);
|
527 |
+
},
|
528 |
+
easeInQuint: function (t) {
|
529 |
+
return 1 * (t /= 1) * t * t * t * t;
|
530 |
+
},
|
531 |
+
easeOutQuint: function (t) {
|
532 |
+
return 1 * ((t = t / 1 - 1) * t * t * t * t + 1);
|
533 |
+
},
|
534 |
+
easeInOutQuint: function (t) {
|
535 |
+
if ((t /= 1 / 2) < 1) return 1 / 2 * t * t * t * t * t;
|
536 |
+
return 1 / 2 * ((t -= 2) * t * t * t * t + 2);
|
537 |
+
},
|
538 |
+
easeInSine: function (t) {
|
539 |
+
return -1 * Math.cos(t / 1 * (Math.PI / 2)) + 1;
|
540 |
+
},
|
541 |
+
easeOutSine: function (t) {
|
542 |
+
return 1 * Math.sin(t / 1 * (Math.PI / 2));
|
543 |
+
},
|
544 |
+
easeInOutSine: function (t) {
|
545 |
+
return -1 / 2 * (Math.cos(Math.PI * t / 1) - 1);
|
546 |
+
},
|
547 |
+
easeInExpo: function (t) {
|
548 |
+
return (t === 0) ? 1 : 1 * Math.pow(2, 10 * (t / 1 - 1));
|
549 |
+
},
|
550 |
+
easeOutExpo: function (t) {
|
551 |
+
return (t === 1) ? 1 : 1 * (-Math.pow(2, -10 * t / 1) + 1);
|
552 |
+
},
|
553 |
+
easeInOutExpo: function (t) {
|
554 |
+
if (t === 0) return 0;
|
555 |
+
if (t === 1) return 1;
|
556 |
+
if ((t /= 1 / 2) < 1) return 1 / 2 * Math.pow(2, 10 * (t - 1));
|
557 |
+
return 1 / 2 * (-Math.pow(2, -10 * --t) + 2);
|
558 |
+
},
|
559 |
+
easeInCirc: function (t) {
|
560 |
+
if (t >= 1) return t;
|
561 |
+
return -1 * (Math.sqrt(1 - (t /= 1) * t) - 1);
|
562 |
+
},
|
563 |
+
easeOutCirc: function (t) {
|
564 |
+
return 1 * Math.sqrt(1 - (t = t / 1 - 1) * t);
|
565 |
+
},
|
566 |
+
easeInOutCirc: function (t) {
|
567 |
+
if ((t /= 1 / 2) < 1) return -1 / 2 * (Math.sqrt(1 - t * t) - 1);
|
568 |
+
return 1 / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1);
|
569 |
+
},
|
570 |
+
easeInElastic: function (t) {
|
571 |
+
var s = 1.70158;
|
572 |
+
var p = 0;
|
573 |
+
var a = 1;
|
574 |
+
if (t === 0) return 0;
|
575 |
+
if ((t /= 1) == 1) return 1;
|
576 |
+
if (!p) p = 1 * 0.3;
|
577 |
+
if (a < Math.abs(1)) {
|
578 |
+
a = 1;
|
579 |
+
s = p / 4;
|
580 |
+
} else s = p / (2 * Math.PI) * Math.asin(1 / a);
|
581 |
+
return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p));
|
582 |
+
},
|
583 |
+
easeOutElastic: function (t) {
|
584 |
+
var s = 1.70158;
|
585 |
+
var p = 0;
|
586 |
+
var a = 1;
|
587 |
+
if (t === 0) return 0;
|
588 |
+
if ((t /= 1) == 1) return 1;
|
589 |
+
if (!p) p = 1 * 0.3;
|
590 |
+
if (a < Math.abs(1)) {
|
591 |
+
a = 1;
|
592 |
+
s = p / 4;
|
593 |
+
} else s = p / (2 * Math.PI) * Math.asin(1 / a);
|
594 |
+
return a * Math.pow(2, -10 * t) * Math.sin((t * 1 - s) * (2 * Math.PI) / p) + 1;
|
595 |
+
},
|
596 |
+
easeInOutElastic: function (t) {
|
597 |
+
var s = 1.70158;
|
598 |
+
var p = 0;
|
599 |
+
var a = 1;
|
600 |
+
if (t === 0) return 0;
|
601 |
+
if ((t /= 1 / 2) == 2) return 1;
|
602 |
+
if (!p) p = 1 * (0.3 * 1.5);
|
603 |
+
if (a < Math.abs(1)) {
|
604 |
+
a = 1;
|
605 |
+
s = p / 4;
|
606 |
+
} else s = p / (2 * Math.PI) * Math.asin(1 / a);
|
607 |
+
if (t < 1) return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p));
|
608 |
+
return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * 1 - s) * (2 * Math.PI) / p) * 0.5 + 1;
|
609 |
+
},
|
610 |
+
easeInBack: function (t) {
|
611 |
+
var s = 1.70158;
|
612 |
+
return 1 * (t /= 1) * t * ((s + 1) * t - s);
|
613 |
+
},
|
614 |
+
easeOutBack: function (t) {
|
615 |
+
var s = 1.70158;
|
616 |
+
return 1 * ((t = t / 1 - 1) * t * ((s + 1) * t + s) + 1);
|
617 |
+
},
|
618 |
+
easeInOutBack: function (t) {
|
619 |
+
var s = 1.70158;
|
620 |
+
if ((t /= 1 / 2) < 1) return 1 / 2 * (t * t * (((s *= (1.525)) + 1) * t - s));
|
621 |
+
return 1 / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);
|
622 |
+
},
|
623 |
+
easeInBounce: function (t) {
|
624 |
+
return 1 - easingEffects.easeOutBounce(1 - t);
|
625 |
+
},
|
626 |
+
easeOutBounce: function (t) {
|
627 |
+
if ((t /= 1) < (1 / 2.75)) {
|
628 |
+
return 1 * (7.5625 * t * t);
|
629 |
+
} else if (t < (2 / 2.75)) {
|
630 |
+
return 1 * (7.5625 * (t -= (1.5 / 2.75)) * t + 0.75);
|
631 |
+
} else if (t < (2.5 / 2.75)) {
|
632 |
+
return 1 * (7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375);
|
633 |
+
} else {
|
634 |
+
return 1 * (7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375);
|
635 |
+
}
|
636 |
+
},
|
637 |
+
easeInOutBounce: function (t) {
|
638 |
+
if (t < 1 / 2) return easingEffects.easeInBounce(t * 2) * 0.5;
|
639 |
+
return easingEffects.easeOutBounce(t * 2 - 1) * 0.5 + 1 * 0.5;
|
640 |
+
}
|
641 |
+
},
|
642 |
+
//Request animation polyfill - http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/
|
643 |
+
requestAnimFrame = helpers.requestAnimFrame = (function(){
|
644 |
+
return window.requestAnimationFrame ||
|
645 |
+
window.webkitRequestAnimationFrame ||
|
646 |
+
window.mozRequestAnimationFrame ||
|
647 |
+
window.oRequestAnimationFrame ||
|
648 |
+
window.msRequestAnimationFrame ||
|
649 |
+
function(callback) {
|
650 |
+
return window.setTimeout(callback, 1000 / 60);
|
651 |
+
};
|
652 |
+
})(),
|
653 |
+
cancelAnimFrame = helpers.cancelAnimFrame = (function(){
|
654 |
+
return window.cancelAnimationFrame ||
|
655 |
+
window.webkitCancelAnimationFrame ||
|
656 |
+
window.mozCancelAnimationFrame ||
|
657 |
+
window.oCancelAnimationFrame ||
|
658 |
+
window.msCancelAnimationFrame ||
|
659 |
+
function(callback) {
|
660 |
+
return window.clearTimeout(callback, 1000 / 60);
|
661 |
+
};
|
662 |
+
})(),
|
663 |
+
animationLoop = helpers.animationLoop = function(callback,totalSteps,easingString,onProgress,onComplete,chartInstance){
|
664 |
+
|
665 |
+
var currentStep = 0,
|
666 |
+
easingFunction = easingEffects[easingString] || easingEffects.linear;
|
667 |
+
|
668 |
+
var animationFrame = function(){
|
669 |
+
currentStep++;
|
670 |
+
var stepDecimal = currentStep/totalSteps;
|
671 |
+
var easeDecimal = easingFunction(stepDecimal);
|
672 |
+
|
673 |
+
callback.call(chartInstance,easeDecimal,stepDecimal, currentStep);
|
674 |
+
onProgress.call(chartInstance,easeDecimal,stepDecimal);
|
675 |
+
if (currentStep < totalSteps){
|
676 |
+
chartInstance.animationFrame = requestAnimFrame(animationFrame);
|
677 |
+
} else{
|
678 |
+
onComplete.apply(chartInstance);
|
679 |
+
}
|
680 |
+
};
|
681 |
+
requestAnimFrame(animationFrame);
|
682 |
+
},
|
683 |
+
//-- DOM methods
|
684 |
+
getRelativePosition = helpers.getRelativePosition = function(evt){
|
685 |
+
var mouseX, mouseY;
|
686 |
+
var e = evt.originalEvent || evt,
|
687 |
+
canvas = evt.currentTarget || evt.srcElement,
|
688 |
+
boundingRect = canvas.getBoundingClientRect();
|
689 |
+
|
690 |
+
if (e.touches){
|
691 |
+
mouseX = e.touches[0].clientX - boundingRect.left;
|
692 |
+
mouseY = e.touches[0].clientY - boundingRect.top;
|
693 |
+
|
694 |
+
}
|
695 |
+
else{
|
696 |
+
mouseX = e.clientX - boundingRect.left;
|
697 |
+
mouseY = e.clientY - boundingRect.top;
|
698 |
+
}
|
699 |
+
|
700 |
+
return {
|
701 |
+
x : mouseX,
|
702 |
+
y : mouseY
|
703 |
+
};
|
704 |
+
|
705 |
+
},
|
706 |
+
addEvent = helpers.addEvent = function(node,eventType,method){
|
707 |
+
if (node.addEventListener){
|
708 |
+
node.addEventListener(eventType,method);
|
709 |
+
} else if (node.attachEvent){
|
710 |
+
node.attachEvent("on"+eventType, method);
|
711 |
+
} else {
|
712 |
+
node["on"+eventType] = method;
|
713 |
+
}
|
714 |
+
},
|
715 |
+
removeEvent = helpers.removeEvent = function(node, eventType, handler){
|
716 |
+
if (node.removeEventListener){
|
717 |
+
node.removeEventListener(eventType, handler, false);
|
718 |
+
} else if (node.detachEvent){
|
719 |
+
node.detachEvent("on"+eventType,handler);
|
720 |
+
} else{
|
721 |
+
node["on" + eventType] = noop;
|
722 |
+
}
|
723 |
+
},
|
724 |
+
bindEvents = helpers.bindEvents = function(chartInstance, arrayOfEvents, handler){
|
725 |
+
// Create the events object if it's not already present
|
726 |
+
if (!chartInstance.events) chartInstance.events = {};
|
727 |
+
|
728 |
+
each(arrayOfEvents,function(eventName){
|
729 |
+
chartInstance.events[eventName] = function(){
|
730 |
+
handler.apply(chartInstance, arguments);
|
731 |
+
};
|
732 |
+
addEvent(chartInstance.chart.canvas,eventName,chartInstance.events[eventName]);
|
733 |
+
});
|
734 |
+
},
|
735 |
+
unbindEvents = helpers.unbindEvents = function (chartInstance, arrayOfEvents) {
|
736 |
+
each(arrayOfEvents, function(handler,eventName){
|
737 |
+
removeEvent(chartInstance.chart.canvas, eventName, handler);
|
738 |
+
});
|
739 |
+
},
|
740 |
+
getMaximumWidth = helpers.getMaximumWidth = function(domNode){
|
741 |
+
var container = domNode.parentNode;
|
742 |
+
// TODO = check cross browser stuff with this.
|
743 |
+
return container.clientWidth;
|
744 |
+
},
|
745 |
+
getMaximumHeight = helpers.getMaximumHeight = function(domNode){
|
746 |
+
var container = domNode.parentNode;
|
747 |
+
// TODO = check cross browser stuff with this.
|
748 |
+
return container.clientHeight;
|
749 |
+
},
|
750 |
+
getMaximumSize = helpers.getMaximumSize = helpers.getMaximumWidth, // legacy support
|
751 |
+
retinaScale = helpers.retinaScale = function(chart){
|
752 |
+
var ctx = chart.ctx,
|
753 |
+
width = chart.canvas.width,
|
754 |
+
height = chart.canvas.height;
|
755 |
+
|
756 |
+
if (window.devicePixelRatio) {
|
757 |
+
ctx.canvas.style.width = width + "px";
|
758 |
+
ctx.canvas.style.height = height + "px";
|
759 |
+
ctx.canvas.height = height * window.devicePixelRatio;
|
760 |
+
ctx.canvas.width = width * window.devicePixelRatio;
|
761 |
+
ctx.scale(window.devicePixelRatio, window.devicePixelRatio);
|
762 |
+
}
|
763 |
+
},
|
764 |
+
//-- Canvas methods
|
765 |
+
clear = helpers.clear = function(chart){
|
766 |
+
chart.ctx.clearRect(0,0,chart.width,chart.height);
|
767 |
+
},
|
768 |
+
fontString = helpers.fontString = function(pixelSize,fontStyle,fontFamily){
|
769 |
+
return fontStyle + " " + pixelSize+"px " + fontFamily;
|
770 |
+
},
|
771 |
+
longestText = helpers.longestText = function(ctx,font,arrayOfStrings){
|
772 |
+
ctx.font = font;
|
773 |
+
var longest = 0;
|
774 |
+
each(arrayOfStrings,function(string){
|
775 |
+
var textWidth = ctx.measureText(string).width;
|
776 |
+
longest = (textWidth > longest) ? textWidth : longest;
|
777 |
+
});
|
778 |
+
return longest;
|
779 |
+
},
|
780 |
+
drawRoundedRectangle = helpers.drawRoundedRectangle = function(ctx,x,y,width,height,radius){
|
781 |
+
ctx.beginPath();
|
782 |
+
ctx.moveTo(x + radius, y);
|
783 |
+
ctx.lineTo(x + width - radius, y);
|
784 |
+
ctx.quadraticCurveTo(x + width, y, x + width, y + radius);
|
785 |
+
ctx.lineTo(x + width, y + height - radius);
|
786 |
+
ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);
|
787 |
+
ctx.lineTo(x + radius, y + height);
|
788 |
+
ctx.quadraticCurveTo(x, y + height, x, y + height - radius);
|
789 |
+
ctx.lineTo(x, y + radius);
|
790 |
+
ctx.quadraticCurveTo(x, y, x + radius, y);
|
791 |
+
ctx.closePath();
|
792 |
+
};
|
793 |
+
|
794 |
+
|
795 |
+
//Store a reference to each instance - allowing us to globally resize chart instances on window resize.
|
796 |
+
//Destroy method on the chart will remove the instance of the chart from this reference.
|
797 |
+
Chart.instances = {};
|
798 |
+
|
799 |
+
Chart.Type = function(data,options,chart){
|
800 |
+
this.options = options;
|
801 |
+
this.chart = chart;
|
802 |
+
this.id = uid();
|
803 |
+
//Add the chart instance to the global namespace
|
804 |
+
Chart.instances[this.id] = this;
|
805 |
+
|
806 |
+
// Initialize is always called when a chart type is created
|
807 |
+
// By default it is a no op, but it should be extended
|
808 |
+
if (options.responsive){
|
809 |
+
this.resize();
|
810 |
+
}
|
811 |
+
this.initialize.call(this,data);
|
812 |
+
};
|
813 |
+
|
814 |
+
//Core methods that'll be a part of every chart type
|
815 |
+
extend(Chart.Type.prototype,{
|
816 |
+
initialize : function(){return this;},
|
817 |
+
clear : function(){
|
818 |
+
clear(this.chart);
|
819 |
+
return this;
|
820 |
+
},
|
821 |
+
stop : function(){
|
822 |
+
// Stops any current animation loop occuring
|
823 |
+
helpers.cancelAnimFrame.call(root, this.animationFrame);
|
824 |
+
return this;
|
825 |
+
},
|
826 |
+
resize : function(callback){
|
827 |
+
this.stop();
|
828 |
+
var canvas = this.chart.canvas,
|
829 |
+
newWidth = getMaximumWidth(this.chart.canvas),
|
830 |
+
newHeight = this.options.maintainAspectRatio ? newWidth / this.chart.aspectRatio : getMaximumHeight(this.chart.canvas);
|
831 |
+
|
832 |
+
canvas.width = this.chart.width = newWidth;
|
833 |
+
canvas.height = this.chart.height = newHeight;
|
834 |
+
|
835 |
+
retinaScale(this.chart);
|
836 |
+
|
837 |
+
if (typeof callback === "function"){
|
838 |
+
callback.apply(this, Array.prototype.slice.call(arguments, 1));
|
839 |
+
}
|
840 |
+
return this;
|
841 |
+
},
|
842 |
+
reflow : noop,
|
843 |
+
render : function(reflow){
|
844 |
+
if (reflow){
|
845 |
+
this.reflow();
|
846 |
+
}
|
847 |
+
if (this.options.animation && !reflow){
|
848 |
+
helpers.animationLoop(
|
849 |
+
this.draw,
|
850 |
+
this.options.animationSteps,
|
851 |
+
this.options.animationEasing,
|
852 |
+
this.options.onAnimationProgress,
|
853 |
+
this.options.onAnimationComplete,
|
854 |
+
this
|
855 |
+
);
|
856 |
+
}
|
857 |
+
else{
|
858 |
+
this.draw();
|
859 |
+
this.options.onAnimationComplete.call(this);
|
860 |
+
}
|
861 |
+
return this;
|
862 |
+
},
|
863 |
+
generateLegend : function(){
|
864 |
+
return template(this.options.legendTemplate,this);
|
865 |
+
},
|
866 |
+
destroy : function(){
|
867 |
+
this.clear();
|
868 |
+
unbindEvents(this, this.events);
|
869 |
+
delete Chart.instances[this.id];
|
870 |
+
},
|
871 |
+
showTooltip : function(ChartElements, forceRedraw){
|
872 |
+
// Only redraw the chart if we've actually changed what we're hovering on.
|
873 |
+
if (typeof this.activeElements === 'undefined') this.activeElements = [];
|
874 |
+
|
875 |
+
var isChanged = (function(Elements){
|
876 |
+
var changed = false;
|
877 |
+
|
878 |
+
if (Elements.length !== this.activeElements.length){
|
879 |
+
changed = true;
|
880 |
+
return changed;
|
881 |
+
}
|
882 |
+
|
883 |
+
each(Elements, function(element, index){
|
884 |
+
if (element !== this.activeElements[index]){
|
885 |
+
changed = true;
|
886 |
+
}
|
887 |
+
}, this);
|
888 |
+
return changed;
|
889 |
+
}).call(this, ChartElements);
|
890 |
+
|
891 |
+
if (!isChanged && !forceRedraw){
|
892 |
+
return;
|
893 |
+
}
|
894 |
+
else{
|
895 |
+
this.activeElements = ChartElements;
|
896 |
+
}
|
897 |
+
this.draw();
|
898 |
+
if (ChartElements.length > 0){
|
899 |
+
// If we have multiple datasets, show a MultiTooltip for all of the data points at that index
|
900 |
+
if (this.datasets && this.datasets.length > 1) {
|
901 |
+
var dataArray,
|
902 |
+
dataIndex;
|
903 |
+
|
904 |
+
for (var i = this.datasets.length - 1; i >= 0; i--) {
|
905 |
+
dataArray = this.datasets[i].points || this.datasets[i].bars || this.datasets[i].segments;
|
906 |
+
dataIndex = indexOf(dataArray, ChartElements[0]);
|
907 |
+
if (dataIndex !== -1){
|
908 |
+
break;
|
909 |
+
}
|
910 |
+
}
|
911 |
+
var tooltipLabels = [],
|
912 |
+
tooltipColors = [],
|
913 |
+
medianPosition = (function(index) {
|
914 |
+
|
915 |
+
// Get all the points at that particular index
|
916 |
+
var Elements = [],
|
917 |
+
dataCollection,
|
918 |
+
xPositions = [],
|
919 |
+
yPositions = [],
|
920 |
+
xMax,
|
921 |
+
yMax,
|
922 |
+
xMin,
|
923 |
+
yMin;
|
924 |
+
helpers.each(this.datasets, function(dataset){
|
925 |
+
dataCollection = dataset.points || dataset.bars || dataset.segments;
|
926 |
+
if (dataCollection[dataIndex] && dataCollection[dataIndex].hasValue()){
|
927 |
+
Elements.push(dataCollection[dataIndex]);
|
928 |
+
}
|
929 |
+
});
|
930 |
+
|
931 |
+
helpers.each(Elements, function(element) {
|
932 |
+
xPositions.push(element.x);
|
933 |
+
yPositions.push(element.y);
|
934 |
+
|
935 |
+
|
936 |
+
//Include any colour information about the element
|
937 |
+
tooltipLabels.push(helpers.template(this.options.multiTooltipTemplate, element));
|
938 |
+
tooltipColors.push({
|
939 |
+
fill: element._saved.fillColor || element.fillColor,
|
940 |
+
stroke: element._saved.strokeColor || element.strokeColor
|
941 |
+
});
|
942 |
+
|
943 |
+
}, this);
|
944 |
+
|
945 |
+
yMin = min(yPositions);
|
946 |
+
yMax = max(yPositions);
|
947 |
+
|
948 |
+
xMin = min(xPositions);
|
949 |
+
xMax = max(xPositions);
|
950 |
+
|
951 |
+
return {
|
952 |
+
x: (xMin > this.chart.width/2) ? xMin : xMax,
|
953 |
+
y: (yMin + yMax)/2
|
954 |
+
};
|
955 |
+
}).call(this, dataIndex);
|
956 |
+
|
957 |
+
new Chart.MultiTooltip({
|
958 |
+
x: medianPosition.x,
|
959 |
+
y: medianPosition.y,
|
960 |
+
xPadding: this.options.tooltipXPadding,
|
961 |
+
yPadding: this.options.tooltipYPadding,
|
962 |
+
xOffset: this.options.tooltipXOffset,
|
963 |
+
fillColor: this.options.tooltipFillColor,
|
964 |
+
textColor: this.options.tooltipFontColor,
|
965 |
+
fontFamily: this.options.tooltipFontFamily,
|
966 |
+
fontStyle: this.options.tooltipFontStyle,
|
967 |
+
fontSize: this.options.tooltipFontSize,
|
968 |
+
titleTextColor: this.options.tooltipTitleFontColor,
|
969 |
+
titleFontFamily: this.options.tooltipTitleFontFamily,
|
970 |
+
titleFontStyle: this.options.tooltipTitleFontStyle,
|
971 |
+
titleFontSize: this.options.tooltipTitleFontSize,
|
972 |
+
cornerRadius: this.options.tooltipCornerRadius,
|
973 |
+
labels: tooltipLabels,
|
974 |
+
legendColors: tooltipColors,
|
975 |
+
legendColorBackground : this.options.multiTooltipKeyBackground,
|
976 |
+
title: ChartElements[0].label,
|
977 |
+
chart: this.chart,
|
978 |
+
ctx: this.chart.ctx
|
979 |
+
}).draw();
|
980 |
+
|
981 |
+
} else {
|
982 |
+
each(ChartElements, function(Element) {
|
983 |
+
var tooltipPosition = Element.tooltipPosition();
|
984 |
+
new Chart.Tooltip({
|
985 |
+
x: Math.round(tooltipPosition.x),
|
986 |
+
y: Math.round(tooltipPosition.y),
|
987 |
+
xPadding: this.options.tooltipXPadding,
|
988 |
+
yPadding: this.options.tooltipYPadding,
|
989 |
+
fillColor: this.options.tooltipFillColor,
|
990 |
+
textColor: this.options.tooltipFontColor,
|
991 |
+
fontFamily: this.options.tooltipFontFamily,
|
992 |
+
fontStyle: this.options.tooltipFontStyle,
|
993 |
+
fontSize: this.options.tooltipFontSize,
|
994 |
+
caretHeight: this.options.tooltipCaretSize,
|
995 |
+
cornerRadius: this.options.tooltipCornerRadius,
|
996 |
+
text: template(this.options.tooltipTemplate, Element),
|
997 |
+
chart: this.chart
|
998 |
+
}).draw();
|
999 |
+
}, this);
|
1000 |
+
}
|
1001 |
+
}
|
1002 |
+
return this;
|
1003 |
+
},
|
1004 |
+
toBase64Image : function(){
|
1005 |
+
return this.chart.canvas.toDataURL.apply(this.chart.canvas, arguments);
|
1006 |
+
}
|
1007 |
+
});
|
1008 |
+
|
1009 |
+
Chart.Type.extend = function(extensions){
|
1010 |
+
|
1011 |
+
var parent = this;
|
1012 |
+
|
1013 |
+
var ChartType = function(){
|
1014 |
+
return parent.apply(this,arguments);
|
1015 |
+
};
|
1016 |
+
|
1017 |
+
//Copy the prototype object of the this class
|
1018 |
+
ChartType.prototype = clone(parent.prototype);
|
1019 |
+
//Now overwrite some of the properties in the base class with the new extensions
|
1020 |
+
extend(ChartType.prototype, extensions);
|
1021 |
+
|
1022 |
+
ChartType.extend = Chart.Type.extend;
|
1023 |
+
|
1024 |
+
if (extensions.name || parent.prototype.name){
|
1025 |
+
|
1026 |
+
var chartName = extensions.name || parent.prototype.name;
|
1027 |
+
//Assign any potential default values of the new chart type
|
1028 |
+
|
1029 |
+
//If none are defined, we'll use a clone of the chart type this is being extended from.
|
1030 |
+
//I.e. if we extend a line chart, we'll use the defaults from the line chart if our new chart
|
1031 |
+
//doesn't define some defaults of their own.
|
1032 |
+
|
1033 |
+
var baseDefaults = (Chart.defaults[parent.prototype.name]) ? clone(Chart.defaults[parent.prototype.name]) : {};
|
1034 |
+
|
1035 |
+
Chart.defaults[chartName] = extend(baseDefaults,extensions.defaults);
|
1036 |
+
|
1037 |
+
Chart.types[chartName] = ChartType;
|
1038 |
+
|
1039 |
+
//Register this new chart type in the Chart prototype
|
1040 |
+
Chart.prototype[chartName] = function(data,options){
|
1041 |
+
var config = merge(Chart.defaults.global, Chart.defaults[chartName], options || {});
|
1042 |
+
return new ChartType(data,config,this);
|
1043 |
+
};
|
1044 |
+
} else{
|
1045 |
+
warn("Name not provided for this chart, so it hasn't been registered");
|
1046 |
+
}
|
1047 |
+
return parent;
|
1048 |
+
};
|
1049 |
+
|
1050 |
+
Chart.Element = function(configuration){
|
1051 |
+
extend(this,configuration);
|
1052 |
+
this.initialize.apply(this,arguments);
|
1053 |
+
this.save();
|
1054 |
+
};
|
1055 |
+
extend(Chart.Element.prototype,{
|
1056 |
+
initialize : function(){},
|
1057 |
+
restore : function(props){
|
1058 |
+
if (!props){
|
1059 |
+
extend(this,this._saved);
|
1060 |
+
} else {
|
1061 |
+
each(props,function(key){
|
1062 |
+
this[key] = this._saved[key];
|
1063 |
+
},this);
|
1064 |
+
}
|
1065 |
+
return this;
|
1066 |
+
},
|
1067 |
+
save : function(){
|
1068 |
+
this._saved = clone(this);
|
1069 |
+
delete this._saved._saved;
|
1070 |
+
return this;
|
1071 |
+
},
|
1072 |
+
update : function(newProps){
|
1073 |
+
each(newProps,function(value,key){
|
1074 |
+
this._saved[key] = this[key];
|
1075 |
+
this[key] = value;
|
1076 |
+
},this);
|
1077 |
+
return this;
|
1078 |
+
},
|
1079 |
+
transition : function(props,ease){
|
1080 |
+
each(props,function(value,key){
|
1081 |
+
this[key] = ((value - this._saved[key]) * ease) + this._saved[key];
|
1082 |
+
},this);
|
1083 |
+
return this;
|
1084 |
+
},
|
1085 |
+
tooltipPosition : function(){
|
1086 |
+
return {
|
1087 |
+
x : this.x,
|
1088 |
+
y : this.y
|
1089 |
+
};
|
1090 |
+
},
|
1091 |
+
hasValue: function(){
|
1092 |
+
return isNumber(this.value);
|
1093 |
+
}
|
1094 |
+
});
|
1095 |
+
|
1096 |
+
Chart.Element.extend = inherits;
|
1097 |
+
|
1098 |
+
|
1099 |
+
Chart.Point = Chart.Element.extend({
|
1100 |
+
display: true,
|
1101 |
+
inRange: function(chartX,chartY){
|
1102 |
+
var hitDetectionRange = this.hitDetectionRadius + this.radius;
|
1103 |
+
return ((Math.pow(chartX-this.x, 2)+Math.pow(chartY-this.y, 2)) < Math.pow(hitDetectionRange,2));
|
1104 |
+
},
|
1105 |
+
draw : function(){
|
1106 |
+
if (this.display){
|
1107 |
+
var ctx = this.ctx;
|
1108 |
+
ctx.beginPath();
|
1109 |
+
|
1110 |
+
ctx.arc(this.x, this.y, this.radius, 0, Math.PI*2);
|
1111 |
+
ctx.closePath();
|
1112 |
+
|
1113 |
+
ctx.strokeStyle = this.strokeColor;
|
1114 |
+
ctx.lineWidth = this.strokeWidth;
|
1115 |
+
|
1116 |
+
ctx.fillStyle = this.fillColor;
|
1117 |
+
|
1118 |
+
ctx.fill();
|
1119 |
+
ctx.stroke();
|
1120 |
+
}
|
1121 |
+
|
1122 |
+
|
1123 |
+
//Quick debug for bezier curve splining
|
1124 |
+
//Highlights control points and the line between them.
|
1125 |
+
//Handy for dev - stripped in the min version.
|
1126 |
+
|
1127 |
+
// ctx.save();
|
1128 |
+
// ctx.fillStyle = "black";
|
1129 |
+
// ctx.strokeStyle = "black"
|
1130 |
+
// ctx.beginPath();
|
1131 |
+
// ctx.arc(this.controlPoints.inner.x,this.controlPoints.inner.y, 2, 0, Math.PI*2);
|
1132 |
+
// ctx.fill();
|
1133 |
+
|
1134 |
+
// ctx.beginPath();
|
1135 |
+
// ctx.arc(this.controlPoints.outer.x,this.controlPoints.outer.y, 2, 0, Math.PI*2);
|
1136 |
+
// ctx.fill();
|
1137 |
+
|
1138 |
+
// ctx.moveTo(this.controlPoints.inner.x,this.controlPoints.inner.y);
|
1139 |
+
// ctx.lineTo(this.x, this.y);
|
1140 |
+
// ctx.lineTo(this.controlPoints.outer.x,this.controlPoints.outer.y);
|
1141 |
+
// ctx.stroke();
|
1142 |
+
|
1143 |
+
// ctx.restore();
|
1144 |
+
|
1145 |
+
|
1146 |
+
|
1147 |
+
}
|
1148 |
+
});
|
1149 |
+
|
1150 |
+
Chart.Arc = Chart.Element.extend({
|
1151 |
+
inRange : function(chartX,chartY){
|
1152 |
+
|
1153 |
+
var pointRelativePosition = helpers.getAngleFromPoint(this, {
|
1154 |
+
x: chartX,
|
1155 |
+
y: chartY
|
1156 |
+
});
|
1157 |
+
|
1158 |
+
//Check if within the range of the open/close angle
|
1159 |
+
var betweenAngles = (pointRelativePosition.angle >= this.startAngle && pointRelativePosition.angle <= this.endAngle),
|
1160 |
+
withinRadius = (pointRelativePosition.distance >= this.innerRadius && pointRelativePosition.distance <= this.outerRadius);
|
1161 |
+
|
1162 |
+
return (betweenAngles && withinRadius);
|
1163 |
+
//Ensure within the outside of the arc centre, but inside arc outer
|
1164 |
+
},
|
1165 |
+
tooltipPosition : function(){
|
1166 |
+
var centreAngle = this.startAngle + ((this.endAngle - this.startAngle) / 2),
|
1167 |
+
rangeFromCentre = (this.outerRadius - this.innerRadius) / 2 + this.innerRadius;
|
1168 |
+
return {
|
1169 |
+
x : this.x + (Math.cos(centreAngle) * rangeFromCentre),
|
1170 |
+
y : this.y + (Math.sin(centreAngle) * rangeFromCentre)
|
1171 |
+
};
|
1172 |
+
},
|
1173 |
+
draw : function(animationPercent){
|
1174 |
+
|
1175 |
+
var easingDecimal = animationPercent || 1;
|
1176 |
+
|
1177 |
+
var ctx = this.ctx;
|
1178 |
+
|
1179 |
+
ctx.beginPath();
|
1180 |
+
|
1181 |
+
ctx.arc(this.x, this.y, this.outerRadius, this.startAngle, this.endAngle);
|
1182 |
+
|
1183 |
+
ctx.arc(this.x, this.y, this.innerRadius, this.endAngle, this.startAngle, true);
|
1184 |
+
|
1185 |
+
ctx.closePath();
|
1186 |
+
ctx.strokeStyle = this.strokeColor;
|
1187 |
+
ctx.lineWidth = this.strokeWidth;
|
1188 |
+
|
1189 |
+
ctx.fillStyle = this.fillColor;
|
1190 |
+
|
1191 |
+
ctx.fill();
|
1192 |
+
ctx.lineJoin = 'bevel';
|
1193 |
+
|
1194 |
+
if (this.showStroke){
|
1195 |
+
ctx.stroke();
|
1196 |
+
}
|
1197 |
+
}
|
1198 |
+
});
|
1199 |
+
|
1200 |
+
Chart.Rectangle = Chart.Element.extend({
|
1201 |
+
draw : function(){
|
1202 |
+
var ctx = this.ctx,
|
1203 |
+
halfWidth = this.width/2,
|
1204 |
+
leftX = this.x - halfWidth,
|
1205 |
+
rightX = this.x + halfWidth,
|
1206 |
+
top = this.base - (this.base - this.y),
|
1207 |
+
halfStroke = this.strokeWidth / 2;
|
1208 |
+
|
1209 |
+
// Canvas doesn't allow us to stroke inside the width so we can
|
1210 |
+
// adjust the sizes to fit if we're setting a stroke on the line
|
1211 |
+
if (this.showStroke){
|
1212 |
+
leftX += halfStroke;
|
1213 |
+
rightX -= halfStroke;
|
1214 |
+
top += halfStroke;
|
1215 |
+
}
|
1216 |
+
|
1217 |
+
ctx.beginPath();
|
1218 |
+
|
1219 |
+
ctx.fillStyle = this.fillColor;
|
1220 |
+
ctx.strokeStyle = this.strokeColor;
|
1221 |
+
ctx.lineWidth = this.strokeWidth;
|
1222 |
+
|
1223 |
+
// It'd be nice to keep this class totally generic to any rectangle
|
1224 |
+
// and simply specify which border to miss out.
|
1225 |
+
ctx.moveTo(leftX, this.base);
|
1226 |
+
ctx.lineTo(leftX, top);
|
1227 |
+
ctx.lineTo(rightX, top);
|
1228 |
+
ctx.lineTo(rightX, this.base);
|
1229 |
+
ctx.fill();
|
1230 |
+
if (this.showStroke){
|
1231 |
+
ctx.stroke();
|
1232 |
+
}
|
1233 |
+
},
|
1234 |
+
height : function(){
|
1235 |
+
return this.base - this.y;
|
1236 |
+
},
|
1237 |
+
inRange : function(chartX,chartY){
|
1238 |
+
return (chartX >= this.x - this.width/2 && chartX <= this.x + this.width/2) && (chartY >= this.y && chartY <= this.base);
|
1239 |
+
}
|
1240 |
+
});
|
1241 |
+
|
1242 |
+
Chart.Tooltip = Chart.Element.extend({
|
1243 |
+
draw : function(){
|
1244 |
+
|
1245 |
+
var ctx = this.chart.ctx;
|
1246 |
+
|
1247 |
+
ctx.font = fontString(this.fontSize,this.fontStyle,this.fontFamily);
|
1248 |
+
|
1249 |
+
this.xAlign = "center";
|
1250 |
+
this.yAlign = "above";
|
1251 |
+
|
1252 |
+
//Distance between the actual element.y position and the start of the tooltip caret
|
1253 |
+
var caretPadding = 2;
|
1254 |
+
|
1255 |
+
var tooltipWidth = ctx.measureText(this.text).width + 2*this.xPadding,
|
1256 |
+
tooltipRectHeight = this.fontSize + 2*this.yPadding,
|
1257 |
+
tooltipHeight = tooltipRectHeight + this.caretHeight + caretPadding;
|
1258 |
+
|
1259 |
+
if (this.x + tooltipWidth/2 >this.chart.width){
|
1260 |
+
this.xAlign = "left";
|
1261 |
+
} else if (this.x - tooltipWidth/2 < 0){
|
1262 |
+
this.xAlign = "right";
|
1263 |
+
}
|
1264 |
+
|
1265 |
+
if (this.y - tooltipHeight < 0){
|
1266 |
+
this.yAlign = "below";
|
1267 |
+
}
|
1268 |
+
|
1269 |
+
|
1270 |
+
var tooltipX = this.x - tooltipWidth/2,
|
1271 |
+
tooltipY = this.y - tooltipHeight;
|
1272 |
+
|
1273 |
+
ctx.fillStyle = this.fillColor;
|
1274 |
+
|
1275 |
+
switch(this.yAlign)
|
1276 |
+
{
|
1277 |
+
case "above":
|
1278 |
+
//Draw a caret above the x/y
|
1279 |
+
ctx.beginPath();
|
1280 |
+
ctx.moveTo(this.x,this.y - caretPadding);
|
1281 |
+
ctx.lineTo(this.x + this.caretHeight, this.y - (caretPadding + this.caretHeight));
|
1282 |
+
ctx.lineTo(this.x - this.caretHeight, this.y - (caretPadding + this.caretHeight));
|
1283 |
+
ctx.closePath();
|
1284 |
+
ctx.fill();
|
1285 |
+
break;
|
1286 |
+
case "below":
|
1287 |
+
tooltipY = this.y + caretPadding + this.caretHeight;
|
1288 |
+
//Draw a caret below the x/y
|
1289 |
+
ctx.beginPath();
|
1290 |
+
ctx.moveTo(this.x, this.y + caretPadding);
|
1291 |
+
ctx.lineTo(this.x + this.caretHeight, this.y + caretPadding + this.caretHeight);
|
1292 |
+
ctx.lineTo(this.x - this.caretHeight, this.y + caretPadding + this.caretHeight);
|
1293 |
+
ctx.closePath();
|
1294 |
+
ctx.fill();
|
1295 |
+
break;
|
1296 |
+
}
|
1297 |
+
|
1298 |
+
switch(this.xAlign)
|
1299 |
+
{
|
1300 |
+
case "left":
|
1301 |
+
tooltipX = this.x - tooltipWidth + (this.cornerRadius + this.caretHeight);
|
1302 |
+
break;
|
1303 |
+
case "right":
|
1304 |
+
tooltipX = this.x - (this.cornerRadius + this.caretHeight);
|
1305 |
+
break;
|
1306 |
+
}
|
1307 |
+
|
1308 |
+
drawRoundedRectangle(ctx,tooltipX,tooltipY,tooltipWidth,tooltipRectHeight,this.cornerRadius);
|
1309 |
+
|
1310 |
+
ctx.fill();
|
1311 |
+
|
1312 |
+
ctx.fillStyle = this.textColor;
|
1313 |
+
ctx.textAlign = "center";
|
1314 |
+
ctx.textBaseline = "middle";
|
1315 |
+
ctx.fillText(this.text, tooltipX + tooltipWidth/2, tooltipY + tooltipRectHeight/2);
|
1316 |
+
}
|
1317 |
+
});
|
1318 |
+
|
1319 |
+
Chart.MultiTooltip = Chart.Element.extend({
|
1320 |
+
initialize : function(){
|
1321 |
+
this.font = fontString(this.fontSize,this.fontStyle,this.fontFamily);
|
1322 |
+
|
1323 |
+
this.titleFont = fontString(this.titleFontSize,this.titleFontStyle,this.titleFontFamily);
|
1324 |
+
|
1325 |
+
this.height = (this.labels.length * this.fontSize) + ((this.labels.length-1) * (this.fontSize/2)) + (this.yPadding*2) + this.titleFontSize *1.5;
|
1326 |
+
|
1327 |
+
this.ctx.font = this.titleFont;
|
1328 |
+
|
1329 |
+
var titleWidth = this.ctx.measureText(this.title).width,
|
1330 |
+
//Label has a legend square as well so account for this.
|
1331 |
+
labelWidth = longestText(this.ctx,this.font,this.labels) + this.fontSize + 3,
|
1332 |
+
longestTextWidth = max([labelWidth,titleWidth]);
|
1333 |
+
|
1334 |
+
this.width = longestTextWidth + (this.xPadding*2);
|
1335 |
+
|
1336 |
+
|
1337 |
+
var halfHeight = this.height/2;
|
1338 |
+
|
1339 |
+
//Check to ensure the height will fit on the canvas
|
1340 |
+
//The three is to buffer form the very
|
1341 |
+
if (this.y - halfHeight < 0 ){
|
1342 |
+
this.y = halfHeight;
|
1343 |
+
} else if (this.y + halfHeight > this.chart.height){
|
1344 |
+
this.y = this.chart.height - halfHeight;
|
1345 |
+
}
|
1346 |
+
|
1347 |
+
//Decide whether to align left or right based on position on canvas
|
1348 |
+
if (this.x > this.chart.width/2){
|
1349 |
+
this.x -= this.xOffset + this.width;
|
1350 |
+
} else {
|
1351 |
+
this.x += this.xOffset;
|
1352 |
+
}
|
1353 |
+
|
1354 |
+
|
1355 |
+
},
|
1356 |
+
getLineHeight : function(index){
|
1357 |
+
var baseLineHeight = this.y - (this.height/2) + this.yPadding,
|
1358 |
+
afterTitleIndex = index-1;
|
1359 |
+
|
1360 |
+
//If the index is zero, we're getting the title
|
1361 |
+
if (index === 0){
|
1362 |
+
return baseLineHeight + this.titleFontSize/2;
|
1363 |
+
} else{
|
1364 |
+
return baseLineHeight + ((this.fontSize*1.5*afterTitleIndex) + this.fontSize/2) + this.titleFontSize * 1.5;
|
1365 |
+
}
|
1366 |
+
|
1367 |
+
},
|
1368 |
+
draw : function(){
|
1369 |
+
drawRoundedRectangle(this.ctx,this.x,this.y - this.height/2,this.width,this.height,this.cornerRadius);
|
1370 |
+
var ctx = this.ctx;
|
1371 |
+
ctx.fillStyle = this.fillColor;
|
1372 |
+
ctx.fill();
|
1373 |
+
ctx.closePath();
|
1374 |
+
|
1375 |
+
ctx.textAlign = "left";
|
1376 |
+
ctx.textBaseline = "middle";
|
1377 |
+
ctx.fillStyle = this.titleTextColor;
|
1378 |
+
ctx.font = this.titleFont;
|
1379 |
+
|
1380 |
+
ctx.fillText(this.title,this.x + this.xPadding, this.getLineHeight(0));
|
1381 |
+
|
1382 |
+
ctx.font = this.font;
|
1383 |
+
helpers.each(this.labels,function(label,index){
|
1384 |
+
ctx.fillStyle = this.textColor;
|
1385 |
+
ctx.fillText(label,this.x + this.xPadding + this.fontSize + 3, this.getLineHeight(index + 1));
|
1386 |
+
|
1387 |
+
//A bit gnarly, but clearing this rectangle breaks when using explorercanvas (clears whole canvas)
|
1388 |
+
//ctx.clearRect(this.x + this.xPadding, this.getLineHeight(index + 1) - this.fontSize/2, this.fontSize, this.fontSize);
|
1389 |
+
//Instead we'll make a white filled block to put the legendColour palette over.
|
1390 |
+
|
1391 |
+
ctx.fillStyle = this.legendColorBackground;
|
1392 |
+
ctx.fillRect(this.x + this.xPadding, this.getLineHeight(index + 1) - this.fontSize/2, this.fontSize, this.fontSize);
|
1393 |
+
|
1394 |
+
ctx.fillStyle = this.legendColors[index].fill;
|
1395 |
+
ctx.fillRect(this.x + this.xPadding, this.getLineHeight(index + 1) - this.fontSize/2, this.fontSize, this.fontSize);
|
1396 |
+
|
1397 |
+
|
1398 |
+
},this);
|
1399 |
+
}
|
1400 |
+
});
|
1401 |
+
|
1402 |
+
Chart.Scale = Chart.Element.extend({
|
1403 |
+
initialize : function(){
|
1404 |
+
this.fit();
|
1405 |
+
},
|
1406 |
+
buildYLabels : function(){
|
1407 |
+
this.yLabels = [];
|
1408 |
+
|
1409 |
+
var stepDecimalPlaces = getDecimalPlaces(this.stepValue);
|
1410 |
+
|
1411 |
+
for (var i=0; i<=this.steps; i++){
|
1412 |
+
this.yLabels.push(template(this.templateString,{value:(this.min + (i * this.stepValue)).toFixed(stepDecimalPlaces)}));
|
1413 |
+
}
|
1414 |
+
this.yLabelWidth = (this.display && this.showLabels) ? longestText(this.ctx,this.font,this.yLabels) : 0;
|
1415 |
+
},
|
1416 |
+
addXLabel : function(label){
|
1417 |
+
this.xLabels.push(label);
|
1418 |
+
this.valuesCount++;
|
1419 |
+
this.fit();
|
1420 |
+
},
|
1421 |
+
removeXLabel : function(){
|
1422 |
+
this.xLabels.shift();
|
1423 |
+
this.valuesCount--;
|
1424 |
+
this.fit();
|
1425 |
+
},
|
1426 |
+
// Fitting loop to rotate x Labels and figure out what fits there, and also calculate how many Y steps to use
|
1427 |
+
fit: function(){
|
1428 |
+
// First we need the width of the yLabels, assuming the xLabels aren't rotated
|
1429 |
+
|
1430 |
+
// To do that we need the base line at the top and base of the chart, assuming there is no x label rotation
|
1431 |
+
this.startPoint = (this.display) ? this.fontSize : 0;
|
1432 |
+
this.endPoint = (this.display) ? this.height - (this.fontSize * 1.5) - 5 : this.height; // -5 to pad labels
|
1433 |
+
|
1434 |
+
// Apply padding settings to the start and end point.
|
1435 |
+
this.startPoint += this.padding;
|
1436 |
+
this.endPoint -= this.padding;
|
1437 |
+
|
1438 |
+
// Cache the starting height, so can determine if we need to recalculate the scale yAxis
|
1439 |
+
var cachedHeight = this.endPoint - this.startPoint,
|
1440 |
+
cachedYLabelWidth;
|
1441 |
+
|
1442 |
+
// Build the current yLabels so we have an idea of what size they'll be to start
|
1443 |
+
/*
|
1444 |
+
* This sets what is returned from calculateScaleRange as static properties of this class:
|
1445 |
+
*
|
1446 |
+
this.steps;
|
1447 |
+
this.stepValue;
|
1448 |
+
this.min;
|
1449 |
+
this.max;
|
1450 |
+
*
|
1451 |
+
*/
|
1452 |
+
this.calculateYRange(cachedHeight);
|
1453 |
+
|
1454 |
+
// With these properties set we can now build the array of yLabels
|
1455 |
+
// and also the width of the largest yLabel
|
1456 |
+
this.buildYLabels();
|
1457 |
+
|
1458 |
+
this.calculateXLabelRotation();
|
1459 |
+
|
1460 |
+
while((cachedHeight > this.endPoint - this.startPoint)){
|
1461 |
+
cachedHeight = this.endPoint - this.startPoint;
|
1462 |
+
cachedYLabelWidth = this.yLabelWidth;
|
1463 |
+
|
1464 |
+
this.calculateYRange(cachedHeight);
|
1465 |
+
this.buildYLabels();
|
1466 |
+
|
1467 |
+
// Only go through the xLabel loop again if the yLabel width has changed
|
1468 |
+
if (cachedYLabelWidth < this.yLabelWidth){
|
1469 |
+
this.calculateXLabelRotation();
|
1470 |
+
}
|
1471 |
+
}
|
1472 |
+
|
1473 |
+
},
|
1474 |
+
calculateXLabelRotation : function(){
|
1475 |
+
//Get the width of each grid by calculating the difference
|
1476 |
+
//between x offsets between 0 and 1.
|
1477 |
+
|
1478 |
+
this.ctx.font = this.font;
|
1479 |
+
|
1480 |
+
var firstWidth = this.ctx.measureText(this.xLabels[0]).width,
|
1481 |
+
lastWidth = this.ctx.measureText(this.xLabels[this.xLabels.length - 1]).width,
|
1482 |
+
firstRotated,
|
1483 |
+
lastRotated;
|
1484 |
+
|
1485 |
+
|
1486 |
+
this.xScalePaddingRight = lastWidth/2 + 3;
|
1487 |
+
this.xScalePaddingLeft = (firstWidth/2 > this.yLabelWidth + 10) ? firstWidth/2 : this.yLabelWidth + 10;
|
1488 |
+
|
1489 |
+
this.xLabelRotation = 0;
|
1490 |
+
if (this.display){
|
1491 |
+
var originalLabelWidth = longestText(this.ctx,this.font,this.xLabels),
|
1492 |
+
cosRotation,
|
1493 |
+
firstRotatedWidth;
|
1494 |
+
this.xLabelWidth = originalLabelWidth;
|
1495 |
+
//Allow 3 pixels x2 padding either side for label readability
|
1496 |
+
var xGridWidth = Math.floor(this.calculateX(1) - this.calculateX(0)) - 6;
|
1497 |
+
|
1498 |
+
//Max label rotate should be 90 - also act as a loop counter
|
1499 |
+
while ((this.xLabelWidth > xGridWidth && this.xLabelRotation === 0) || (this.xLabelWidth > xGridWidth && this.xLabelRotation <= 90 && this.xLabelRotation > 0)){
|
1500 |
+
cosRotation = Math.cos(toRadians(this.xLabelRotation));
|
1501 |
+
|
1502 |
+
firstRotated = cosRotation * firstWidth;
|
1503 |
+
lastRotated = cosRotation * lastWidth;
|
1504 |
+
|
1505 |
+
// We're right aligning the text now.
|
1506 |
+
if (firstRotated + this.fontSize / 2 > this.yLabelWidth + 8){
|
1507 |
+
this.xScalePaddingLeft = firstRotated + this.fontSize / 2;
|
1508 |
+
}
|
1509 |
+
this.xScalePaddingRight = this.fontSize/2;
|
1510 |
+
|
1511 |
+
|
1512 |
+
this.xLabelRotation++;
|
1513 |
+
this.xLabelWidth = cosRotation * originalLabelWidth;
|
1514 |
+
|
1515 |
+
}
|
1516 |
+
if (this.xLabelRotation > 0){
|
1517 |
+
this.endPoint -= Math.sin(toRadians(this.xLabelRotation))*originalLabelWidth + 3;
|
1518 |
+
}
|
1519 |
+
}
|
1520 |
+
else{
|
1521 |
+
this.xLabelWidth = 0;
|
1522 |
+
this.xScalePaddingRight = this.padding;
|
1523 |
+
this.xScalePaddingLeft = this.padding;
|
1524 |
+
}
|
1525 |
+
|
1526 |
+
},
|
1527 |
+
// Needs to be overidden in each Chart type
|
1528 |
+
// Otherwise we need to pass all the data into the scale class
|
1529 |
+
calculateYRange: noop,
|
1530 |
+
drawingArea: function(){
|
1531 |
+
return this.startPoint - this.endPoint;
|
1532 |
+
},
|
1533 |
+
calculateY : function(value){
|
1534 |
+
var scalingFactor = this.drawingArea() / (this.min - this.max);
|
1535 |
+
return this.endPoint - (scalingFactor * (value - this.min));
|
1536 |
+
},
|
1537 |
+
calculateX : function(index){
|
1538 |
+
var isRotated = (this.xLabelRotation > 0),
|
1539 |
+
// innerWidth = (this.offsetGridLines) ? this.width - offsetLeft - this.padding : this.width - (offsetLeft + halfLabelWidth * 2) - this.padding,
|
1540 |
+
innerWidth = this.width - (this.xScalePaddingLeft + this.xScalePaddingRight),
|
1541 |
+
valueWidth = innerWidth/(this.valuesCount - ((this.offsetGridLines) ? 0 : 1)),
|
1542 |
+
valueOffset = (valueWidth * index) + this.xScalePaddingLeft;
|
1543 |
+
|
1544 |
+
if (this.offsetGridLines){
|
1545 |
+
valueOffset += (valueWidth/2);
|
1546 |
+
}
|
1547 |
+
|
1548 |
+
return Math.round(valueOffset);
|
1549 |
+
},
|
1550 |
+
update : function(newProps){
|
1551 |
+
helpers.extend(this, newProps);
|
1552 |
+
this.fit();
|
1553 |
+
},
|
1554 |
+
draw : function(){
|
1555 |
+
var ctx = this.ctx,
|
1556 |
+
yLabelGap = (this.endPoint - this.startPoint) / this.steps,
|
1557 |
+
xStart = Math.round(this.xScalePaddingLeft);
|
1558 |
+
if (this.display){
|
1559 |
+
ctx.fillStyle = this.textColor;
|
1560 |
+
ctx.font = this.font;
|
1561 |
+
each(this.yLabels,function(labelString,index){
|
1562 |
+
var yLabelCenter = this.endPoint - (yLabelGap * index),
|
1563 |
+
linePositionY = Math.round(yLabelCenter);
|
1564 |
+
|
1565 |
+
ctx.textAlign = "right";
|
1566 |
+
ctx.textBaseline = "middle";
|
1567 |
+
if (this.showLabels){
|
1568 |
+
ctx.fillText(labelString,xStart - 10,yLabelCenter);
|
1569 |
+
}
|
1570 |
+
ctx.beginPath();
|
1571 |
+
if (index > 0){
|
1572 |
+
// This is a grid line in the centre, so drop that
|
1573 |
+
ctx.lineWidth = this.gridLineWidth;
|
1574 |
+
ctx.strokeStyle = this.gridLineColor;
|
1575 |
+
} else {
|
1576 |
+
// This is the first line on the scale
|
1577 |
+
ctx.lineWidth = this.lineWidth;
|
1578 |
+
ctx.strokeStyle = this.lineColor;
|
1579 |
+
}
|
1580 |
+
|
1581 |
+
linePositionY += helpers.aliasPixel(ctx.lineWidth);
|
1582 |
+
|
1583 |
+
ctx.moveTo(xStart, linePositionY);
|
1584 |
+
ctx.lineTo(this.width, linePositionY);
|
1585 |
+
ctx.stroke();
|
1586 |
+
ctx.closePath();
|
1587 |
+
|
1588 |
+
ctx.lineWidth = this.lineWidth;
|
1589 |
+
ctx.strokeStyle = this.lineColor;
|
1590 |
+
ctx.beginPath();
|
1591 |
+
ctx.moveTo(xStart - 5, linePositionY);
|
1592 |
+
ctx.lineTo(xStart, linePositionY);
|
1593 |
+
ctx.stroke();
|
1594 |
+
ctx.closePath();
|
1595 |
+
|
1596 |
+
},this);
|
1597 |
+
|
1598 |
+
each(this.xLabels,function(label,index){
|
1599 |
+
var xPos = this.calculateX(index) + aliasPixel(this.lineWidth),
|
1600 |
+
// Check to see if line/bar here and decide where to place the line
|
1601 |
+
linePos = this.calculateX(index - (this.offsetGridLines ? 0.5 : 0)) + aliasPixel(this.lineWidth),
|
1602 |
+
isRotated = (this.xLabelRotation > 0);
|
1603 |
+
|
1604 |
+
ctx.beginPath();
|
1605 |
+
|
1606 |
+
if (index > 0){
|
1607 |
+
// This is a grid line in the centre, so drop that
|
1608 |
+
ctx.lineWidth = this.gridLineWidth;
|
1609 |
+
ctx.strokeStyle = this.gridLineColor;
|
1610 |
+
} else {
|
1611 |
+
// This is the first line on the scale
|
1612 |
+
ctx.lineWidth = this.lineWidth;
|
1613 |
+
ctx.strokeStyle = this.lineColor;
|
1614 |
+
}
|
1615 |
+
ctx.moveTo(linePos,this.endPoint);
|
1616 |
+
ctx.lineTo(linePos,this.startPoint - 3);
|
1617 |
+
ctx.stroke();
|
1618 |
+
ctx.closePath();
|
1619 |
+
|
1620 |
+
|
1621 |
+
ctx.lineWidth = this.lineWidth;
|
1622 |
+
ctx.strokeStyle = this.lineColor;
|
1623 |
+
|
1624 |
+
|
1625 |
+
// Small lines at the bottom of the base grid line
|
1626 |
+
ctx.beginPath();
|
1627 |
+
ctx.moveTo(linePos,this.endPoint);
|
1628 |
+
ctx.lineTo(linePos,this.endPoint + 5);
|
1629 |
+
ctx.stroke();
|
1630 |
+
ctx.closePath();
|
1631 |
+
|
1632 |
+
ctx.save();
|
1633 |
+
ctx.translate(xPos,(isRotated) ? this.endPoint + 12 : this.endPoint + 8);
|
1634 |
+
ctx.rotate(toRadians(this.xLabelRotation)*-1);
|
1635 |
+
ctx.font = this.font;
|
1636 |
+
ctx.textAlign = (isRotated) ? "right" : "center";
|
1637 |
+
ctx.textBaseline = (isRotated) ? "middle" : "top";
|
1638 |
+
ctx.fillText(label, 0, 0);
|
1639 |
+
ctx.restore();
|
1640 |
+
},this);
|
1641 |
+
|
1642 |
+
}
|
1643 |
+
}
|
1644 |
+
|
1645 |
+
});
|
1646 |
+
|
1647 |
+
Chart.RadialScale = Chart.Element.extend({
|
1648 |
+
initialize: function(){
|
1649 |
+
this.size = min([this.height, this.width]);
|
1650 |
+
this.drawingArea = (this.display) ? (this.size/2) - (this.fontSize/2 + this.backdropPaddingY) : (this.size/2);
|
1651 |
+
},
|
1652 |
+
calculateCenterOffset: function(value){
|
1653 |
+
// Take into account half font size + the yPadding of the top value
|
1654 |
+
var scalingFactor = this.drawingArea / (this.max - this.min);
|
1655 |
+
|
1656 |
+
return (value - this.min) * scalingFactor;
|
1657 |
+
},
|
1658 |
+
update : function(){
|
1659 |
+
if (!this.lineArc){
|
1660 |
+
this.setScaleSize();
|
1661 |
+
} else {
|
1662 |
+
this.drawingArea = (this.display) ? (this.size/2) - (this.fontSize/2 + this.backdropPaddingY) : (this.size/2);
|
1663 |
+
}
|
1664 |
+
this.buildYLabels();
|
1665 |
+
},
|
1666 |
+
buildYLabels: function(){
|
1667 |
+
this.yLabels = [];
|
1668 |
+
|
1669 |
+
var stepDecimalPlaces = getDecimalPlaces(this.stepValue);
|
1670 |
+
|
1671 |
+
for (var i=0; i<=this.steps; i++){
|
1672 |
+
this.yLabels.push(template(this.templateString,{value:(this.min + (i * this.stepValue)).toFixed(stepDecimalPlaces)}));
|
1673 |
+
}
|
1674 |
+
},
|
1675 |
+
getCircumference : function(){
|
1676 |
+
return ((Math.PI*2) / this.valuesCount);
|
1677 |
+
},
|
1678 |
+
setScaleSize: function(){
|
1679 |
+
/*
|
1680 |
+
* Right, this is really confusing and there is a lot of maths going on here
|
1681 |
+
* The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9
|
1682 |
+
*
|
1683 |
+
* Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif
|
1684 |
+
*
|
1685 |
+
* Solution:
|
1686 |
+
*
|
1687 |
+
* We assume the radius of the polygon is half the size of the canvas at first
|
1688 |
+
* at each index we check if the text overlaps.
|
1689 |
+
*
|
1690 |
+
* Where it does, we store that angle and that index.
|
1691 |
+
*
|
1692 |
+
* After finding the largest index and angle we calculate how much we need to remove
|
1693 |
+
* from the shape radius to move the point inwards by that x.
|
1694 |
+
*
|
1695 |
+
* We average the left and right distances to get the maximum shape radius that can fit in the box
|
1696 |
+
* along with labels.
|
1697 |
+
*
|
1698 |
+
* Once we have that, we can find the centre point for the chart, by taking the x text protrusion
|
1699 |
+
* on each side, removing that from the size, halving it and adding the left x protrusion width.
|
1700 |
+
*
|
1701 |
+
* This will mean we have a shape fitted to the canvas, as large as it can be with the labels
|
1702 |
+
* and position it in the most space efficient manner
|
1703 |
+
*
|
1704 |
+
* https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif
|
1705 |
+
*/
|
1706 |
+
|
1707 |
+
|
1708 |
+
// Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.
|
1709 |
+
// Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points
|
1710 |
+
var largestPossibleRadius = min([(this.height/2 - this.pointLabelFontSize - 5), this.width/2]),
|
1711 |
+
pointPosition,
|
1712 |
+
i,
|
1713 |
+
textWidth,
|
1714 |
+
halfTextWidth,
|
1715 |
+
furthestRight = this.width,
|
1716 |
+
furthestRightIndex,
|
1717 |
+
furthestRightAngle,
|
1718 |
+
furthestLeft = 0,
|
1719 |
+
furthestLeftIndex,
|
1720 |
+
furthestLeftAngle,
|
1721 |
+
xProtrusionLeft,
|
1722 |
+
xProtrusionRight,
|
1723 |
+
radiusReductionRight,
|
1724 |
+
radiusReductionLeft,
|
1725 |
+
maxWidthRadius;
|
1726 |
+
this.ctx.font = fontString(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily);
|
1727 |
+
for (i=0;i<this.valuesCount;i++){
|
1728 |
+
// 5px to space the text slightly out - similar to what we do in the draw function.
|
1729 |
+
pointPosition = this.getPointPosition(i, largestPossibleRadius);
|
1730 |
+
textWidth = this.ctx.measureText(template(this.templateString, { value: this.labels[i] })).width + 5;
|
1731 |
+
if (i === 0 || i === this.valuesCount/2){
|
1732 |
+
// If we're at index zero, or exactly the middle, we're at exactly the top/bottom
|
1733 |
+
// of the radar chart, so text will be aligned centrally, so we'll half it and compare
|
1734 |
+
// w/left and right text sizes
|
1735 |
+
halfTextWidth = textWidth/2;
|
1736 |
+
if (pointPosition.x + halfTextWidth > furthestRight) {
|
1737 |
+
furthestRight = pointPosition.x + halfTextWidth;
|
1738 |
+
furthestRightIndex = i;
|
1739 |
+
}
|
1740 |
+
if (pointPosition.x - halfTextWidth < furthestLeft) {
|
1741 |
+
furthestLeft = pointPosition.x - halfTextWidth;
|
1742 |
+
furthestLeftIndex = i;
|
1743 |
+
}
|
1744 |
+
}
|
1745 |
+
else if (i < this.valuesCount/2) {
|
1746 |
+
// Less than half the values means we'll left align the text
|
1747 |
+
if (pointPosition.x + textWidth > furthestRight) {
|
1748 |
+
furthestRight = pointPosition.x + textWidth;
|
1749 |
+
furthestRightIndex = i;
|
1750 |
+
}
|
1751 |
+
}
|
1752 |
+
else if (i > this.valuesCount/2){
|
1753 |
+
// More than half the values means we'll right align the text
|
1754 |
+
if (pointPosition.x - textWidth < furthestLeft) {
|
1755 |
+
furthestLeft = pointPosition.x - textWidth;
|
1756 |
+
furthestLeftIndex = i;
|
1757 |
+
}
|
1758 |
+
}
|
1759 |
+
}
|
1760 |
+
|
1761 |
+
xProtrusionLeft = furthestLeft;
|
1762 |
+
|
1763 |
+
xProtrusionRight = Math.ceil(furthestRight - this.width);
|
1764 |
+
|
1765 |
+
furthestRightAngle = this.getIndexAngle(furthestRightIndex);
|
1766 |
+
|
1767 |
+
furthestLeftAngle = this.getIndexAngle(furthestLeftIndex);
|
1768 |
+
|
1769 |
+
radiusReductionRight = xProtrusionRight / Math.sin(furthestRightAngle + Math.PI/2);
|
1770 |
+
|
1771 |
+
radiusReductionLeft = xProtrusionLeft / Math.sin(furthestLeftAngle + Math.PI/2);
|
1772 |
+
|
1773 |
+
// Ensure we actually need to reduce the size of the chart
|
1774 |
+
radiusReductionRight = (isNumber(radiusReductionRight)) ? radiusReductionRight : 0;
|
1775 |
+
radiusReductionLeft = (isNumber(radiusReductionLeft)) ? radiusReductionLeft : 0;
|
1776 |
+
|
1777 |
+
this.drawingArea = largestPossibleRadius - (radiusReductionLeft + radiusReductionRight)/2;
|
1778 |
+
|
1779 |
+
//this.drawingArea = min([maxWidthRadius, (this.height - (2 * (this.pointLabelFontSize + 5)))/2])
|
1780 |
+
this.setCenterPoint(radiusReductionLeft, radiusReductionRight);
|
1781 |
+
|
1782 |
+
},
|
1783 |
+
setCenterPoint: function(leftMovement, rightMovement){
|
1784 |
+
|
1785 |
+
var maxRight = this.width - rightMovement - this.drawingArea,
|
1786 |
+
maxLeft = leftMovement + this.drawingArea;
|
1787 |
+
|
1788 |
+
this.xCenter = (maxLeft + maxRight)/2;
|
1789 |
+
// Always vertically in the centre as the text height doesn't change
|
1790 |
+
this.yCenter = (this.height/2);
|
1791 |
+
},
|
1792 |
+
|
1793 |
+
getIndexAngle : function(index){
|
1794 |
+
var angleMultiplier = (Math.PI * 2) / this.valuesCount;
|
1795 |
+
// Start from the top instead of right, so remove a quarter of the circle
|
1796 |
+
|
1797 |
+
return index * angleMultiplier - (Math.PI/2);
|
1798 |
+
},
|
1799 |
+
getPointPosition : function(index, distanceFromCenter){
|
1800 |
+
var thisAngle = this.getIndexAngle(index);
|
1801 |
+
return {
|
1802 |
+
x : (Math.cos(thisAngle) * distanceFromCenter) + this.xCenter,
|
1803 |
+
y : (Math.sin(thisAngle) * distanceFromCenter) + this.yCenter
|
1804 |
+
};
|
1805 |
+
},
|
1806 |
+
draw: function(){
|
1807 |
+
if (this.display){
|
1808 |
+
var ctx = this.ctx;
|
1809 |
+
each(this.yLabels, function(label, index){
|
1810 |
+
// Don't draw a centre value
|
1811 |
+
if (index > 0){
|
1812 |
+
var yCenterOffset = index * (this.drawingArea/this.steps),
|
1813 |
+
yHeight = this.yCenter - yCenterOffset,
|
1814 |
+
pointPosition;
|
1815 |
+
|
1816 |
+
// Draw circular lines around the scale
|
1817 |
+
if (this.lineWidth > 0){
|
1818 |
+
ctx.strokeStyle = this.lineColor;
|
1819 |
+
ctx.lineWidth = this.lineWidth;
|
1820 |
+
|
1821 |
+
if(this.lineArc){
|
1822 |
+
ctx.beginPath();
|
1823 |
+
ctx.arc(this.xCenter, this.yCenter, yCenterOffset, 0, Math.PI*2);
|
1824 |
+
ctx.closePath();
|
1825 |
+
ctx.stroke();
|
1826 |
+
} else{
|
1827 |
+
ctx.beginPath();
|
1828 |
+
for (var i=0;i<this.valuesCount;i++)
|
1829 |
+
{
|
1830 |
+
pointPosition = this.getPointPosition(i, this.calculateCenterOffset(this.min + (index * this.stepValue)));
|
1831 |
+
if (i === 0){
|
1832 |
+
ctx.moveTo(pointPosition.x, pointPosition.y);
|
1833 |
+
} else {
|
1834 |
+
ctx.lineTo(pointPosition.x, pointPosition.y);
|
1835 |
+
}
|
1836 |
+
}
|
1837 |
+
ctx.closePath();
|
1838 |
+
ctx.stroke();
|
1839 |
+
}
|
1840 |
+
}
|
1841 |
+
if(this.showLabels){
|
1842 |
+
ctx.font = fontString(this.fontSize,this.fontStyle,this.fontFamily);
|
1843 |
+
if (this.showLabelBackdrop){
|
1844 |
+
var labelWidth = ctx.measureText(label).width;
|
1845 |
+
ctx.fillStyle = this.backdropColor;
|
1846 |
+
ctx.fillRect(
|
1847 |
+
this.xCenter - labelWidth/2 - this.backdropPaddingX,
|
1848 |
+
yHeight - this.fontSize/2 - this.backdropPaddingY,
|
1849 |
+
labelWidth + this.backdropPaddingX*2,
|
1850 |
+
this.fontSize + this.backdropPaddingY*2
|
1851 |
+
);
|
1852 |
+
}
|
1853 |
+
ctx.textAlign = 'center';
|
1854 |
+
ctx.textBaseline = "middle";
|
1855 |
+
ctx.fillStyle = this.fontColor;
|
1856 |
+
ctx.fillText(label, this.xCenter, yHeight);
|
1857 |
+
}
|
1858 |
+
}
|
1859 |
+
}, this);
|
1860 |
+
|
1861 |
+
if (!this.lineArc){
|
1862 |
+
ctx.lineWidth = this.angleLineWidth;
|
1863 |
+
ctx.strokeStyle = this.angleLineColor;
|
1864 |
+
for (var i = this.valuesCount - 1; i >= 0; i--) {
|
1865 |
+
if (this.angleLineWidth > 0){
|
1866 |
+
var outerPosition = this.getPointPosition(i, this.calculateCenterOffset(this.max));
|
1867 |
+
ctx.beginPath();
|
1868 |
+
ctx.moveTo(this.xCenter, this.yCenter);
|
1869 |
+
ctx.lineTo(outerPosition.x, outerPosition.y);
|
1870 |
+
ctx.stroke();
|
1871 |
+
ctx.closePath();
|
1872 |
+
}
|
1873 |
+
// Extra 3px out for some label spacing
|
1874 |
+
var pointLabelPosition = this.getPointPosition(i, this.calculateCenterOffset(this.max) + 5);
|
1875 |
+
ctx.font = fontString(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily);
|
1876 |
+
ctx.fillStyle = this.pointLabelFontColor;
|
1877 |
+
|
1878 |
+
var labelsCount = this.labels.length,
|
1879 |
+
halfLabelsCount = this.labels.length/2,
|
1880 |
+
quarterLabelsCount = halfLabelsCount/2,
|
1881 |
+
upperHalf = (i < quarterLabelsCount || i > labelsCount - quarterLabelsCount),
|
1882 |
+
exactQuarter = (i === quarterLabelsCount || i === labelsCount - quarterLabelsCount);
|
1883 |
+
if (i === 0){
|
1884 |
+
ctx.textAlign = 'center';
|
1885 |
+
} else if(i === halfLabelsCount){
|
1886 |
+
ctx.textAlign = 'center';
|
1887 |
+
} else if (i < halfLabelsCount){
|
1888 |
+
ctx.textAlign = 'left';
|
1889 |
+
} else {
|
1890 |
+
ctx.textAlign = 'right';
|
1891 |
+
}
|
1892 |
+
|
1893 |
+
// Set the correct text baseline based on outer positioning
|
1894 |
+
if (exactQuarter){
|
1895 |
+
ctx.textBaseline = 'middle';
|
1896 |
+
} else if (upperHalf){
|
1897 |
+
ctx.textBaseline = 'bottom';
|
1898 |
+
} else {
|
1899 |
+
ctx.textBaseline = 'top';
|
1900 |
+
}
|
1901 |
+
|
1902 |
+
ctx.fillText(this.labels[i], pointLabelPosition.x, pointLabelPosition.y);
|
1903 |
+
}
|
1904 |
+
}
|
1905 |
+
}
|
1906 |
+
}
|
1907 |
+
});
|
1908 |
+
|
1909 |
+
// Attach global event to resize each chart instance when the browser resizes
|
1910 |
+
helpers.addEvent(window, "resize", (function(){
|
1911 |
+
// Basic debounce of resize function so it doesn't hurt performance when resizing browser.
|
1912 |
+
var timeout;
|
1913 |
+
return function(){
|
1914 |
+
clearTimeout(timeout);
|
1915 |
+
timeout = setTimeout(function(){
|
1916 |
+
each(Chart.instances,function(instance){
|
1917 |
+
// If the responsive flag is set in the chart instance config
|
1918 |
+
// Cascade the resize event down to the chart.
|
1919 |
+
if (instance.options.responsive){
|
1920 |
+
instance.resize(instance.render, true);
|
1921 |
+
}
|
1922 |
+
});
|
1923 |
+
}, 50);
|
1924 |
+
};
|
1925 |
+
})());
|
1926 |
+
|
1927 |
+
|
1928 |
+
if (amd) {
|
1929 |
+
define(function(){
|
1930 |
+
return Chart;
|
1931 |
+
});
|
1932 |
+
} else if (typeof module === 'object' && module.exports) {
|
1933 |
+
module.exports = Chart;
|
1934 |
+
}
|
1935 |
+
|
1936 |
+
root.Chart = Chart;
|
1937 |
+
|
1938 |
+
Chart.noConflict = function(){
|
1939 |
+
root.Chart = previous;
|
1940 |
+
return Chart;
|
1941 |
+
};
|
1942 |
+
|
1943 |
+
}).call(this);
|
lib/Chart_js/src/Chart.Doughnut.js
ADDED
@@ -0,0 +1,184 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
(function(){
|
2 |
+
"use strict";
|
3 |
+
|
4 |
+
var root = this,
|
5 |
+
Chart = root.Chart,
|
6 |
+
//Cache a local reference to Chart.helpers
|
7 |
+
helpers = Chart.helpers;
|
8 |
+
|
9 |
+
var defaultConfig = {
|
10 |
+
//Boolean - Whether we should show a stroke on each segment
|
11 |
+
segmentShowStroke : true,
|
12 |
+
|
13 |
+
//String - The colour of each segment stroke
|
14 |
+
segmentStrokeColor : "#fff",
|
15 |
+
|
16 |
+
//Number - The width of each segment stroke
|
17 |
+
segmentStrokeWidth : 2,
|
18 |
+
|
19 |
+
//The percentage of the chart that we cut out of the middle.
|
20 |
+
percentageInnerCutout : 50,
|
21 |
+
|
22 |
+
//Number - Amount of animation steps
|
23 |
+
animationSteps : 100,
|
24 |
+
|
25 |
+
//String - Animation easing effect
|
26 |
+
animationEasing : "easeOutBounce",
|
27 |
+
|
28 |
+
//Boolean - Whether we animate the rotation of the Doughnut
|
29 |
+
animateRotate : true,
|
30 |
+
|
31 |
+
//Boolean - Whether we animate scaling the Doughnut from the centre
|
32 |
+
animateScale : false,
|
33 |
+
|
34 |
+
//String - A legend template
|
35 |
+
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<segments.length; i++){%><li><span style=\"background-color:<%=segments[i].fillColor%>\"></span><%if(segments[i].label){%><%=segments[i].label%><%}%></li><%}%></ul>"
|
36 |
+
|
37 |
+
};
|
38 |
+
|
39 |
+
|
40 |
+
Chart.Type.extend({
|
41 |
+
//Passing in a name registers this chart in the Chart namespace
|
42 |
+
name: "Doughnut",
|
43 |
+
//Providing a defaults will also register the deafults in the chart namespace
|
44 |
+
defaults : defaultConfig,
|
45 |
+
//Initialize is fired when the chart is initialized - Data is passed in as a parameter
|
46 |
+
//Config is automatically merged by the core of Chart.js, and is available at this.options
|
47 |
+
initialize: function(data){
|
48 |
+
|
49 |
+
//Declare segments as a static property to prevent inheriting across the Chart type prototype
|
50 |
+
this.segments = [];
|
51 |
+
this.outerRadius = (helpers.min([this.chart.width,this.chart.height]) - this.options.segmentStrokeWidth/2)/2;
|
52 |
+
|
53 |
+
this.SegmentArc = Chart.Arc.extend({
|
54 |
+
ctx : this.chart.ctx,
|
55 |
+
x : this.chart.width/2,
|
56 |
+
y : this.chart.height/2
|
57 |
+
});
|
58 |
+
|
59 |
+
//Set up tooltip events on the chart
|
60 |
+
if (this.options.showTooltips){
|
61 |
+
helpers.bindEvents(this, this.options.tooltipEvents, function(evt){
|
62 |
+
var activeSegments = (evt.type !== 'mouseout') ? this.getSegmentsAtEvent(evt) : [];
|
63 |
+
|
64 |
+
helpers.each(this.segments,function(segment){
|
65 |
+
segment.restore(["fillColor"]);
|
66 |
+
});
|
67 |
+
helpers.each(activeSegments,function(activeSegment){
|
68 |
+
activeSegment.fillColor = activeSegment.highlightColor;
|
69 |
+
});
|
70 |
+
this.showTooltip(activeSegments);
|
71 |
+
});
|
72 |
+
}
|
73 |
+
this.calculateTotal(data);
|
74 |
+
|
75 |
+
helpers.each(data,function(datapoint, index){
|
76 |
+
this.addData(datapoint, index, true);
|
77 |
+
},this);
|
78 |
+
|
79 |
+
this.render();
|
80 |
+
},
|
81 |
+
getSegmentsAtEvent : function(e){
|
82 |
+
var segmentsArray = [];
|
83 |
+
|
84 |
+
var location = helpers.getRelativePosition(e);
|
85 |
+
|
86 |
+
helpers.each(this.segments,function(segment){
|
87 |
+
if (segment.inRange(location.x,location.y)) segmentsArray.push(segment);
|
88 |
+
},this);
|
89 |
+
return segmentsArray;
|
90 |
+
},
|
91 |
+
addData : function(segment, atIndex, silent){
|
92 |
+
var index = atIndex || this.segments.length;
|
93 |
+
this.segments.splice(index, 0, new this.SegmentArc({
|
94 |
+
value : segment.value,
|
95 |
+
outerRadius : (this.options.animateScale) ? 0 : this.outerRadius,
|
96 |
+
innerRadius : (this.options.animateScale) ? 0 : (this.outerRadius/100) * this.options.percentageInnerCutout,
|
97 |
+
fillColor : segment.color,
|
98 |
+
highlightColor : segment.highlight || segment.color,
|
99 |
+
showStroke : this.options.segmentShowStroke,
|
100 |
+
strokeWidth : this.options.segmentStrokeWidth,
|
101 |
+
strokeColor : this.options.segmentStrokeColor,
|
102 |
+
startAngle : Math.PI * 1.5,
|
103 |
+
circumference : (this.options.animateRotate) ? 0 : this.calculateCircumference(segment.value),
|
104 |
+
label : segment.label
|
105 |
+
}));
|
106 |
+
if (!silent){
|
107 |
+
this.reflow();
|
108 |
+
this.update();
|
109 |
+
}
|
110 |
+
},
|
111 |
+
calculateCircumference : function(value){
|
112 |
+
return (Math.PI*2)*(value / this.total);
|
113 |
+
},
|
114 |
+
calculateTotal : function(data){
|
115 |
+
this.total = 0;
|
116 |
+
helpers.each(data,function(segment){
|
117 |
+
this.total += segment.value;
|
118 |
+
},this);
|
119 |
+
},
|
120 |
+
update : function(){
|
121 |
+
this.calculateTotal(this.segments);
|
122 |
+
|
123 |
+
// Reset any highlight colours before updating.
|
124 |
+
helpers.each(this.activeElements, function(activeElement){
|
125 |
+
activeElement.restore(['fillColor']);
|
126 |
+
});
|
127 |
+
|
128 |
+
helpers.each(this.segments,function(segment){
|
129 |
+
segment.save();
|
130 |
+
});
|
131 |
+
this.render();
|
132 |
+
},
|
133 |
+
|
134 |
+
removeData: function(atIndex){
|
135 |
+
var indexToDelete = (helpers.isNumber(atIndex)) ? atIndex : this.segments.length-1;
|
136 |
+
this.segments.splice(indexToDelete, 1);
|
137 |
+
this.reflow();
|
138 |
+
this.update();
|
139 |
+
},
|
140 |
+
|
141 |
+
reflow : function(){
|
142 |
+
helpers.extend(this.SegmentArc.prototype,{
|
143 |
+
x : this.chart.width/2,
|
144 |
+
y : this.chart.height/2
|
145 |
+
});
|
146 |
+
this.outerRadius = (helpers.min([this.chart.width,this.chart.height]) - this.options.segmentStrokeWidth/2)/2;
|
147 |
+
helpers.each(this.segments, function(segment){
|
148 |
+
segment.update({
|
149 |
+
outerRadius : this.outerRadius,
|
150 |
+
innerRadius : (this.outerRadius/100) * this.options.percentageInnerCutout
|
151 |
+
});
|
152 |
+
}, this);
|
153 |
+
},
|
154 |
+
draw : function(easeDecimal){
|
155 |
+
var animDecimal = (easeDecimal) ? easeDecimal : 1;
|
156 |
+
this.clear();
|
157 |
+
helpers.each(this.segments,function(segment,index){
|
158 |
+
segment.transition({
|
159 |
+
circumference : this.calculateCircumference(segment.value),
|
160 |
+
outerRadius : this.outerRadius,
|
161 |
+
innerRadius : (this.outerRadius/100) * this.options.percentageInnerCutout
|
162 |
+
},animDecimal);
|
163 |
+
|
164 |
+
segment.endAngle = segment.startAngle + segment.circumference;
|
165 |
+
|
166 |
+
segment.draw();
|
167 |
+
if (index === 0){
|
168 |
+
segment.startAngle = Math.PI * 1.5;
|
169 |
+
}
|
170 |
+
//Check to see if it's the last segment, if not get the next and update the start angle
|
171 |
+
if (index < this.segments.length-1){
|
172 |
+
this.segments[index+1].startAngle = segment.endAngle;
|
173 |
+
}
|
174 |
+
},this);
|
175 |
+
|
176 |
+
}
|
177 |
+
});
|
178 |
+
|
179 |
+
Chart.types.Doughnut.extend({
|
180 |
+
name : "Pie",
|
181 |
+
defaults : helpers.merge(defaultConfig,{percentageInnerCutout : 0})
|
182 |
+
});
|
183 |
+
|
184 |
+
}).call(this);
|
lib/Chart_js/src/Chart.Line.js
ADDED
@@ -0,0 +1,366 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
(function(){
|
2 |
+
"use strict";
|
3 |
+
|
4 |
+
var root = this,
|
5 |
+
Chart = root.Chart,
|
6 |
+
helpers = Chart.helpers;
|
7 |
+
|
8 |
+
var defaultConfig = {
|
9 |
+
|
10 |
+
///Boolean - Whether grid lines are shown across the chart
|
11 |
+
scaleShowGridLines : true,
|
12 |
+
|
13 |
+
//String - Colour of the grid lines
|
14 |
+
scaleGridLineColor : "rgba(0,0,0,.05)",
|
15 |
+
|
16 |
+
//Number - Width of the grid lines
|
17 |
+
scaleGridLineWidth : 1,
|
18 |
+
|
19 |
+
//Boolean - Whether the line is curved between points
|
20 |
+
bezierCurve : true,
|
21 |
+
|
22 |
+
//Number - Tension of the bezier curve between points
|
23 |
+
bezierCurveTension : 0.4,
|
24 |
+
|
25 |
+
//Boolean - Whether to show a dot for each point
|
26 |
+
pointDot : true,
|
27 |
+
|
28 |
+
//Number - Radius of each point dot in pixels
|
29 |
+
pointDotRadius : 4,
|
30 |
+
|
31 |
+
//Number - Pixel width of point dot stroke
|
32 |
+
pointDotStrokeWidth : 1,
|
33 |
+
|
34 |
+
//Number - amount extra to add to the radius to cater for hit detection outside the drawn point
|
35 |
+
pointHitDetectionRadius : 20,
|
36 |
+
|
37 |
+
//Boolean - Whether to show a stroke for datasets
|
38 |
+
datasetStroke : true,
|
39 |
+
|
40 |
+
//Number - Pixel width of dataset stroke
|
41 |
+
datasetStrokeWidth : 2,
|
42 |
+
|
43 |
+
//Boolean - Whether to fill the dataset with a colour
|
44 |
+
datasetFill : true,
|
45 |
+
|
46 |
+
//String - A legend template
|
47 |
+
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].strokeColor%>\"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>"
|
48 |
+
|
49 |
+
};
|
50 |
+
|
51 |
+
|
52 |
+
Chart.Type.extend({
|
53 |
+
name: "Line",
|
54 |
+
defaults : defaultConfig,
|
55 |
+
initialize: function(data){
|
56 |
+
//Declare the extension of the default point, to cater for the options passed in to the constructor
|
57 |
+
this.PointClass = Chart.Point.extend({
|
58 |
+
strokeWidth : this.options.pointDotStrokeWidth,
|
59 |
+
radius : this.options.pointDotRadius,
|
60 |
+
display: this.options.pointDot,
|
61 |
+
hitDetectionRadius : this.options.pointHitDetectionRadius,
|
62 |
+
ctx : this.chart.ctx,
|
63 |
+
inRange : function(mouseX){
|
64 |
+
return (Math.pow(mouseX-this.x, 2) < Math.pow(this.radius + this.hitDetectionRadius,2));
|
65 |
+
}
|
66 |
+
});
|
67 |
+
|
68 |
+
this.datasets = [];
|
69 |
+
|
70 |
+
//Set up tooltip events on the chart
|
71 |
+
if (this.options.showTooltips){
|
72 |
+
helpers.bindEvents(this, this.options.tooltipEvents, function(evt){
|
73 |
+
var activePoints = (evt.type !== 'mouseout') ? this.getPointsAtEvent(evt) : [];
|
74 |
+
this.eachPoints(function(point){
|
75 |
+
point.restore(['fillColor', 'strokeColor']);
|
76 |
+
});
|
77 |
+
helpers.each(activePoints, function(activePoint){
|
78 |
+
activePoint.fillColor = activePoint.highlightFill;
|
79 |
+
activePoint.strokeColor = activePoint.highlightStroke;
|
80 |
+
});
|
81 |
+
this.showTooltip(activePoints);
|
82 |
+
});
|
83 |
+
}
|
84 |
+
|
85 |
+
//Iterate through each of the datasets, and build this into a property of the chart
|
86 |
+
helpers.each(data.datasets,function(dataset){
|
87 |
+
|
88 |
+
var datasetObject = {
|
89 |
+
label : dataset.label || null,
|
90 |
+
fillColor : dataset.fillColor,
|
91 |
+
strokeColor : dataset.strokeColor,
|
92 |
+
pointColor : dataset.pointColor,
|
93 |
+
pointStrokeColor : dataset.pointStrokeColor,
|
94 |
+
points : []
|
95 |
+
};
|
96 |
+
|
97 |
+
this.datasets.push(datasetObject);
|
98 |
+
|
99 |
+
|
100 |
+
helpers.each(dataset.data,function(dataPoint,index){
|
101 |
+
//Add a new point for each piece of data, passing any required data to draw.
|
102 |
+
datasetObject.points.push(new this.PointClass({
|
103 |
+
value : dataPoint,
|
104 |
+
label : data.labels[index],
|
105 |
+
datasetLabel: dataset.label,
|
106 |
+
strokeColor : dataset.pointStrokeColor,
|
107 |
+
fillColor : dataset.pointColor,
|
108 |
+
highlightFill : dataset.pointHighlightFill || dataset.pointColor,
|
109 |
+
highlightStroke : dataset.pointHighlightStroke || dataset.pointStrokeColor
|
110 |
+
}));
|
111 |
+
},this);
|
112 |
+
|
113 |
+
this.buildScale(data.labels);
|
114 |
+
|
115 |
+
|
116 |
+
this.eachPoints(function(point, index){
|
117 |
+
helpers.extend(point, {
|
118 |
+
x: this.scale.calculateX(index),
|
119 |
+
y: this.scale.endPoint
|
120 |
+
});
|
121 |
+
point.save();
|
122 |
+
}, this);
|
123 |
+
|
124 |
+
},this);
|
125 |
+
|
126 |
+
|
127 |
+
this.render();
|
128 |
+
},
|
129 |
+
update : function(){
|
130 |
+
this.scale.update();
|
131 |
+
// Reset any highlight colours before updating.
|
132 |
+
helpers.each(this.activeElements, function(activeElement){
|
133 |
+
activeElement.restore(['fillColor', 'strokeColor']);
|
134 |
+
});
|
135 |
+
this.eachPoints(function(point){
|
136 |
+
point.save();
|
137 |
+
});
|
138 |
+
this.render();
|
139 |
+
},
|
140 |
+
eachPoints : function(callback){
|
141 |
+
helpers.each(this.datasets,function(dataset){
|
142 |
+
helpers.each(dataset.points,callback,this);
|
143 |
+
},this);
|
144 |
+
},
|
145 |
+
getPointsAtEvent : function(e){
|
146 |
+
var pointsArray = [],
|
147 |
+
eventPosition = helpers.getRelativePosition(e);
|
148 |
+
helpers.each(this.datasets,function(dataset){
|
149 |
+
helpers.each(dataset.points,function(point){
|
150 |
+
if (point.inRange(eventPosition.x,eventPosition.y)) pointsArray.push(point);
|
151 |
+
});
|
152 |
+
},this);
|
153 |
+
return pointsArray;
|
154 |
+
},
|
155 |
+
buildScale : function(labels){
|
156 |
+
var self = this;
|
157 |
+
|
158 |
+
var dataTotal = function(){
|
159 |
+
var values = [];
|
160 |
+
self.eachPoints(function(point){
|
161 |
+
values.push(point.value);
|
162 |
+
});
|
163 |
+
|
164 |
+
return values;
|
165 |
+
};
|
166 |
+
|
167 |
+
var scaleOptions = {
|
168 |
+
templateString : this.options.scaleLabel,
|
169 |
+
height : this.chart.height,
|
170 |
+
width : this.chart.width,
|
171 |
+
ctx : this.chart.ctx,
|
172 |
+
textColor : this.options.scaleFontColor,
|
173 |
+
fontSize : this.options.scaleFontSize,
|
174 |
+
fontStyle : this.options.scaleFontStyle,
|
175 |
+
fontFamily : this.options.scaleFontFamily,
|
176 |
+
valuesCount : labels.length,
|
177 |
+
beginAtZero : this.options.scaleBeginAtZero,
|
178 |
+
integersOnly : this.options.scaleIntegersOnly,
|
179 |
+
calculateYRange : function(currentHeight){
|
180 |
+
var updatedRanges = helpers.calculateScaleRange(
|
181 |
+
dataTotal(),
|
182 |
+
currentHeight,
|
183 |
+
this.fontSize,
|
184 |
+
this.beginAtZero,
|
185 |
+
this.integersOnly
|
186 |
+
);
|
187 |
+
helpers.extend(this, updatedRanges);
|
188 |
+
},
|
189 |
+
xLabels : labels,
|
190 |
+
font : helpers.fontString(this.options.scaleFontSize, this.options.scaleFontStyle, this.options.scaleFontFamily),
|
191 |
+
lineWidth : this.options.scaleLineWidth,
|
192 |
+
lineColor : this.options.scaleLineColor,
|
193 |
+
gridLineWidth : (this.options.scaleShowGridLines) ? this.options.scaleGridLineWidth : 0,
|
194 |
+
gridLineColor : (this.options.scaleShowGridLines) ? this.options.scaleGridLineColor : "rgba(0,0,0,0)",
|
195 |
+
padding: (this.options.showScale) ? 0 : this.options.pointDotRadius + this.options.pointDotStrokeWidth,
|
196 |
+
showLabels : this.options.scaleShowLabels,
|
197 |
+
display : this.options.showScale
|
198 |
+
};
|
199 |
+
|
200 |
+
if (this.options.scaleOverride){
|
201 |
+
helpers.extend(scaleOptions, {
|
202 |
+
calculateYRange: helpers.noop,
|
203 |
+
steps: this.options.scaleSteps,
|
204 |
+
stepValue: this.options.scaleStepWidth,
|
205 |
+
min: this.options.scaleStartValue,
|
206 |
+
max: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth)
|
207 |
+
});
|
208 |
+
}
|
209 |
+
|
210 |
+
|
211 |
+
this.scale = new Chart.Scale(scaleOptions);
|
212 |
+
},
|
213 |
+
addData : function(valuesArray,label){
|
214 |
+
//Map the values array for each of the datasets
|
215 |
+
|
216 |
+
helpers.each(valuesArray,function(value,datasetIndex){
|
217 |
+
//Add a new point for each piece of data, passing any required data to draw.
|
218 |
+
this.datasets[datasetIndex].points.push(new this.PointClass({
|
219 |
+
value : value,
|
220 |
+
label : label,
|
221 |
+
x: this.scale.calculateX(this.scale.valuesCount+1),
|
222 |
+
y: this.scale.endPoint,
|
223 |
+
strokeColor : this.datasets[datasetIndex].pointStrokeColor,
|
224 |
+
fillColor : this.datasets[datasetIndex].pointColor
|
225 |
+
}));
|
226 |
+
},this);
|
227 |
+
|
228 |
+
this.scale.addXLabel(label);
|
229 |
+
//Then re-render the chart.
|
230 |
+
this.update();
|
231 |
+
},
|
232 |
+
removeData : function(){
|
233 |
+
this.scale.removeXLabel();
|
234 |
+
//Then re-render the chart.
|
235 |
+
helpers.each(this.datasets,function(dataset){
|
236 |
+
dataset.points.shift();
|
237 |
+
},this);
|
238 |
+
this.update();
|
239 |
+
},
|
240 |
+
reflow : function(){
|
241 |
+
var newScaleProps = helpers.extend({
|
242 |
+
height : this.chart.height,
|
243 |
+
width : this.chart.width
|
244 |
+
});
|
245 |
+
this.scale.update(newScaleProps);
|
246 |
+
},
|
247 |
+
draw : function(ease){
|
248 |
+
var easingDecimal = ease || 1;
|
249 |
+
this.clear();
|
250 |
+
|
251 |
+
var ctx = this.chart.ctx;
|
252 |
+
|
253 |
+
// Some helper methods for getting the next/prev points
|
254 |
+
var hasValue = function(item){
|
255 |
+
return item.value !== null;
|
256 |
+
},
|
257 |
+
nextPoint = function(point, collection, index){
|
258 |
+
return helpers.findNextWhere(collection, hasValue, index) || point;
|
259 |
+
},
|
260 |
+
previousPoint = function(point, collection, index){
|
261 |
+
return helpers.findPreviousWhere(collection, hasValue, index) || point;
|
262 |
+
};
|
263 |
+
|
264 |
+
this.scale.draw(easingDecimal);
|
265 |
+
|
266 |
+
|
267 |
+
helpers.each(this.datasets,function(dataset){
|
268 |
+
var pointsWithValues = helpers.where(dataset.points, hasValue);
|
269 |
+
|
270 |
+
//Transition each point first so that the line and point drawing isn't out of sync
|
271 |
+
//We can use this extra loop to calculate the control points of this dataset also in this loop
|
272 |
+
|
273 |
+
helpers.each(dataset.points, function(point, index){
|
274 |
+
if (point.hasValue()){
|
275 |
+
point.transition({
|
276 |
+
y : this.scale.calculateY(point.value),
|
277 |
+
x : this.scale.calculateX(index)
|
278 |
+
}, easingDecimal);
|
279 |
+
}
|
280 |
+
},this);
|
281 |
+
|
282 |
+
|
283 |
+
// Control points need to be calculated in a seperate loop, because we need to know the current x/y of the point
|
284 |
+
// This would cause issues when there is no animation, because the y of the next point would be 0, so beziers would be skewed
|
285 |
+
if (this.options.bezierCurve){
|
286 |
+
helpers.each(pointsWithValues, function(point, index){
|
287 |
+
var tension = (index > 0 && index < pointsWithValues.length - 1) ? this.options.bezierCurveTension : 0;
|
288 |
+
point.controlPoints = helpers.splineCurve(
|
289 |
+
previousPoint(point, pointsWithValues, index),
|
290 |
+
point,
|
291 |
+
nextPoint(point, pointsWithValues, index),
|
292 |
+
tension
|
293 |
+
);
|
294 |
+
|
295 |
+
// Prevent the bezier going outside of the bounds of the graph
|
296 |
+
|
297 |
+
// Cap puter bezier handles to the upper/lower scale bounds
|
298 |
+
if (point.controlPoints.outer.y > this.scale.endPoint){
|
299 |
+
point.controlPoints.outer.y = this.scale.endPoint;
|
300 |
+
}
|
301 |
+
else if (point.controlPoints.outer.y < this.scale.startPoint){
|
302 |
+
point.controlPoints.outer.y = this.scale.startPoint;
|
303 |
+
}
|
304 |
+
|
305 |
+
// Cap inner bezier handles to the upper/lower scale bounds
|
306 |
+
if (point.controlPoints.inner.y > this.scale.endPoint){
|
307 |
+
point.controlPoints.inner.y = this.scale.endPoint;
|
308 |
+
}
|
309 |
+
else if (point.controlPoints.inner.y < this.scale.startPoint){
|
310 |
+
point.controlPoints.inner.y = this.scale.startPoint;
|
311 |
+
}
|
312 |
+
},this);
|
313 |
+
}
|
314 |
+
|
315 |
+
|
316 |
+
//Draw the line between all the points
|
317 |
+
ctx.lineWidth = this.options.datasetStrokeWidth;
|
318 |
+
ctx.strokeStyle = dataset.strokeColor;
|
319 |
+
ctx.beginPath();
|
320 |
+
|
321 |
+
helpers.each(pointsWithValues, function(point, index){
|
322 |
+
if (index === 0){
|
323 |
+
ctx.moveTo(point.x, point.y);
|
324 |
+
}
|
325 |
+
else{
|
326 |
+
if(this.options.bezierCurve){
|
327 |
+
var previous = previousPoint(point, pointsWithValues, index);
|
328 |
+
|
329 |
+
ctx.bezierCurveTo(
|
330 |
+
previous.controlPoints.outer.x,
|
331 |
+
previous.controlPoints.outer.y,
|
332 |
+
point.controlPoints.inner.x,
|
333 |
+
point.controlPoints.inner.y,
|
334 |
+
point.x,
|
335 |
+
point.y
|
336 |
+
);
|
337 |
+
}
|
338 |
+
else{
|
339 |
+
ctx.lineTo(point.x,point.y);
|
340 |
+
}
|
341 |
+
}
|
342 |
+
}, this);
|
343 |
+
|
344 |
+
ctx.stroke();
|
345 |
+
|
346 |
+
if (this.options.datasetFill && pointsWithValues.length > 0){
|
347 |
+
//Round off the line by going to the base of the chart, back to the start, then fill.
|
348 |
+
ctx.lineTo(pointsWithValues[pointsWithValues.length - 1].x, this.scale.endPoint);
|
349 |
+
ctx.lineTo(pointsWithValues[0].x, this.scale.endPoint);
|
350 |
+
ctx.fillStyle = dataset.fillColor;
|
351 |
+
ctx.closePath();
|
352 |
+
ctx.fill();
|
353 |
+
}
|
354 |
+
|
355 |
+
//Now draw the points over the line
|
356 |
+
//A little inefficient double looping, but better than the line
|
357 |
+
//lagging behind the point positions
|
358 |
+
helpers.each(pointsWithValues,function(point){
|
359 |
+
point.draw();
|
360 |
+
});
|
361 |
+
},this);
|
362 |
+
}
|
363 |
+
});
|
364 |
+
|
365 |
+
|
366 |
+
}).call(this);
|
lib/Chart_js/src/Chart.PolarArea.js
ADDED
@@ -0,0 +1,248 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
(function(){
|
2 |
+
"use strict";
|
3 |
+
|
4 |
+
var root = this,
|
5 |
+
Chart = root.Chart,
|
6 |
+
//Cache a local reference to Chart.helpers
|
7 |
+
helpers = Chart.helpers;
|
8 |
+
|
9 |
+
var defaultConfig = {
|
10 |
+
//Boolean - Show a backdrop to the scale label
|
11 |
+
scaleShowLabelBackdrop : true,
|
12 |
+
|
13 |
+
//String - The colour of the label backdrop
|
14 |
+
scaleBackdropColor : "rgba(255,255,255,0.75)",
|
15 |
+
|
16 |
+
// Boolean - Whether the scale should begin at zero
|
17 |
+
scaleBeginAtZero : true,
|
18 |
+
|
19 |
+
//Number - The backdrop padding above & below the label in pixels
|
20 |
+
scaleBackdropPaddingY : 2,
|
21 |
+
|
22 |
+
//Number - The backdrop padding to the side of the label in pixels
|
23 |
+
scaleBackdropPaddingX : 2,
|
24 |
+
|
25 |
+
//Boolean - Show line for each value in the scale
|
26 |
+
scaleShowLine : true,
|
27 |
+
|
28 |
+
//Boolean - Stroke a line around each segment in the chart
|
29 |
+
segmentShowStroke : true,
|
30 |
+
|
31 |
+
//String - The colour of the stroke on each segement.
|
32 |
+
segmentStrokeColor : "#fff",
|
33 |
+
|
34 |
+
//Number - The width of the stroke value in pixels
|
35 |
+
segmentStrokeWidth : 2,
|
36 |
+
|
37 |
+
//Number - Amount of animation steps
|
38 |
+
animationSteps : 100,
|
39 |
+
|
40 |
+
//String - Animation easing effect.
|
41 |
+
animationEasing : "easeOutBounce",
|
42 |
+
|
43 |
+
//Boolean - Whether to animate the rotation of the chart
|
44 |
+
animateRotate : true,
|
45 |
+
|
46 |
+
//Boolean - Whether to animate scaling the chart from the centre
|
47 |
+
animateScale : false,
|
48 |
+
|
49 |
+
//String - A legend template
|
50 |
+
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<segments.length; i++){%><li><span style=\"background-color:<%=segments[i].fillColor%>\"></span><%if(segments[i].label){%><%=segments[i].label%><%}%></li><%}%></ul>"
|
51 |
+
};
|
52 |
+
|
53 |
+
|
54 |
+
Chart.Type.extend({
|
55 |
+
//Passing in a name registers this chart in the Chart namespace
|
56 |
+
name: "PolarArea",
|
57 |
+
//Providing a defaults will also register the deafults in the chart namespace
|
58 |
+
defaults : defaultConfig,
|
59 |
+
//Initialize is fired when the chart is initialized - Data is passed in as a parameter
|
60 |
+
//Config is automatically merged by the core of Chart.js, and is available at this.options
|
61 |
+
initialize: function(data){
|
62 |
+
this.segments = [];
|
63 |
+
//Declare segment class as a chart instance specific class, so it can share props for this instance
|
64 |
+
this.SegmentArc = Chart.Arc.extend({
|
65 |
+
showStroke : this.options.segmentShowStroke,
|
66 |
+
strokeWidth : this.options.segmentStrokeWidth,
|
67 |
+
strokeColor : this.options.segmentStrokeColor,
|
68 |
+
ctx : this.chart.ctx,
|
69 |
+
innerRadius : 0,
|
70 |
+
x : this.chart.width/2,
|
71 |
+
y : this.chart.height/2
|
72 |
+
});
|
73 |
+
this.scale = new Chart.RadialScale({
|
74 |
+
display: this.options.showScale,
|
75 |
+
fontStyle: this.options.scaleFontStyle,
|
76 |
+
fontSize: this.options.scaleFontSize,
|
77 |
+
fontFamily: this.options.scaleFontFamily,
|
78 |
+
fontColor: this.options.scaleFontColor,
|
79 |
+
showLabels: this.options.scaleShowLabels,
|
80 |
+
showLabelBackdrop: this.options.scaleShowLabelBackdrop,
|
81 |
+
backdropColor: this.options.scaleBackdropColor,
|
82 |
+
backdropPaddingY : this.options.scaleBackdropPaddingY,
|
83 |
+
backdropPaddingX: this.options.scaleBackdropPaddingX,
|
84 |
+
lineWidth: (this.options.scaleShowLine) ? this.options.scaleLineWidth : 0,
|
85 |
+
lineColor: this.options.scaleLineColor,
|
86 |
+
lineArc: true,
|
87 |
+
width: this.chart.width,
|
88 |
+
height: this.chart.height,
|
89 |
+
xCenter: this.chart.width/2,
|
90 |
+
yCenter: this.chart.height/2,
|
91 |
+
ctx : this.chart.ctx,
|
92 |
+
templateString: this.options.scaleLabel,
|
93 |
+
valuesCount: data.length
|
94 |
+
});
|
95 |
+
|
96 |
+
this.updateScaleRange(data);
|
97 |
+
|
98 |
+
this.scale.update();
|
99 |
+
|
100 |
+
helpers.each(data,function(segment,index){
|
101 |
+
this.addData(segment,index,true);
|
102 |
+
},this);
|
103 |
+
|
104 |
+
//Set up tooltip events on the chart
|
105 |
+
if (this.options.showTooltips){
|
106 |
+
helpers.bindEvents(this, this.options.tooltipEvents, function(evt){
|
107 |
+
var activeSegments = (evt.type !== 'mouseout') ? this.getSegmentsAtEvent(evt) : [];
|
108 |
+
helpers.each(this.segments,function(segment){
|
109 |
+
segment.restore(["fillColor"]);
|
110 |
+
});
|
111 |
+
helpers.each(activeSegments,function(activeSegment){
|
112 |
+
activeSegment.fillColor = activeSegment.highlightColor;
|
113 |
+
});
|
114 |
+
this.showTooltip(activeSegments);
|
115 |
+
});
|
116 |
+
}
|
117 |
+
|
118 |
+
this.render();
|
119 |
+
},
|
120 |
+
getSegmentsAtEvent : function(e){
|
121 |
+
var segmentsArray = [];
|
122 |
+
|
123 |
+
var location = helpers.getRelativePosition(e);
|
124 |
+
|
125 |
+
helpers.each(this.segments,function(segment){
|
126 |
+
if (segment.inRange(location.x,location.y)) segmentsArray.push(segment);
|
127 |
+
},this);
|
128 |
+
return segmentsArray;
|
129 |
+
},
|
130 |
+
addData : function(segment, atIndex, silent){
|
131 |
+
var index = atIndex || this.segments.length;
|
132 |
+
|
133 |
+
this.segments.splice(index, 0, new this.SegmentArc({
|
134 |
+
fillColor: segment.color,
|
135 |
+
highlightColor: segment.highlight || segment.color,
|
136 |
+
label: segment.label,
|
137 |
+
value: segment.value,
|
138 |
+
outerRadius: (this.options.animateScale) ? 0 : this.scale.calculateCenterOffset(segment.value),
|
139 |
+
circumference: (this.options.animateRotate) ? 0 : this.scale.getCircumference(),
|
140 |
+
startAngle: Math.PI * 1.5
|
141 |
+
}));
|
142 |
+
if (!silent){
|
143 |
+
this.reflow();
|
144 |
+
this.update();
|
145 |
+
}
|
146 |
+
},
|
147 |
+
removeData: function(atIndex){
|
148 |
+
var indexToDelete = (helpers.isNumber(atIndex)) ? atIndex : this.segments.length-1;
|
149 |
+
this.segments.splice(indexToDelete, 1);
|
150 |
+
this.reflow();
|
151 |
+
this.update();
|
152 |
+
},
|
153 |
+
calculateTotal: function(data){
|
154 |
+
this.total = 0;
|
155 |
+
helpers.each(data,function(segment){
|
156 |
+
this.total += segment.value;
|
157 |
+
},this);
|
158 |
+
this.scale.valuesCount = this.segments.length;
|
159 |
+
},
|
160 |
+
updateScaleRange: function(datapoints){
|
161 |
+
var valuesArray = [];
|
162 |
+
helpers.each(datapoints,function(segment){
|
163 |
+
valuesArray.push(segment.value);
|
164 |
+
});
|
165 |
+
|
166 |
+
var scaleSizes = (this.options.scaleOverride) ?
|
167 |
+
{
|
168 |
+
steps: this.options.scaleSteps,
|
169 |
+
stepValue: this.options.scaleStepWidth,
|
170 |
+
min: this.options.scaleStartValue,
|
171 |
+
max: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth)
|
172 |
+
} :
|
173 |
+
helpers.calculateScaleRange(
|
174 |
+
valuesArray,
|
175 |
+
helpers.min([this.chart.width, this.chart.height])/2,
|
176 |
+
this.options.scaleFontSize,
|
177 |
+
this.options.scaleBeginAtZero,
|
178 |
+
this.options.scaleIntegersOnly
|
179 |
+
);
|
180 |
+
|
181 |
+
helpers.extend(
|
182 |
+
this.scale,
|
183 |
+
scaleSizes,
|
184 |
+
{
|
185 |
+
size: helpers.min([this.chart.width, this.chart.height]),
|
186 |
+
xCenter: this.chart.width/2,
|
187 |
+
yCenter: this.chart.height/2
|
188 |
+
}
|
189 |
+
);
|
190 |
+
|
191 |
+
},
|
192 |
+
update : function(){
|
193 |
+
this.calculateTotal(this.segments);
|
194 |
+
|
195 |
+
helpers.each(this.segments,function(segment){
|
196 |
+
segment.save();
|
197 |
+
});
|
198 |
+
this.render();
|
199 |
+
},
|
200 |
+
reflow : function(){
|
201 |
+
helpers.extend(this.SegmentArc.prototype,{
|
202 |
+
x : this.chart.width/2,
|
203 |
+
y : this.chart.height/2
|
204 |
+
});
|
205 |
+
this.updateScaleRange(this.segments);
|
206 |
+
this.scale.update();
|
207 |
+
|
208 |
+
helpers.extend(this.scale,{
|
209 |
+
xCenter: this.chart.width/2,
|
210 |
+
yCenter: this.chart.height/2
|
211 |
+
});
|
212 |
+
|
213 |
+
helpers.each(this.segments, function(segment){
|
214 |
+
segment.update({
|
215 |
+
outerRadius : this.scale.calculateCenterOffset(segment.value)
|
216 |
+
});
|
217 |
+
}, this);
|
218 |
+
|
219 |
+
},
|
220 |
+
draw : function(ease){
|
221 |
+
var easingDecimal = ease || 1;
|
222 |
+
//Clear & draw the canvas
|
223 |
+
this.clear();
|
224 |
+
helpers.each(this.segments,function(segment, index){
|
225 |
+
segment.transition({
|
226 |
+
circumference : this.scale.getCircumference(),
|
227 |
+
outerRadius : this.scale.calculateCenterOffset(segment.value)
|
228 |
+
},easingDecimal);
|
229 |
+
|
230 |
+
segment.endAngle = segment.startAngle + segment.circumference;
|
231 |
+
|
232 |
+
// If we've removed the first segment we need to set the first one to
|
233 |
+
// start at the top.
|
234 |
+
if (index === 0){
|
235 |
+
segment.startAngle = Math.PI * 1.5;
|
236 |
+
}
|
237 |
+
|
238 |
+
//Check to see if it's the last segment, if not get the next and update the start angle
|
239 |
+
if (index < this.segments.length - 1){
|
240 |
+
this.segments[index+1].startAngle = segment.endAngle;
|
241 |
+
}
|
242 |
+
segment.draw();
|
243 |
+
}, this);
|
244 |
+
this.scale.draw();
|
245 |
+
}
|
246 |
+
});
|
247 |
+
|
248 |
+
}).call(this);
|
lib/Chart_js/src/Chart.Radar.js
ADDED
@@ -0,0 +1,343 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
(function(){
|
2 |
+
"use strict";
|
3 |
+
|
4 |
+
var root = this,
|
5 |
+
Chart = root.Chart,
|
6 |
+
helpers = Chart.helpers;
|
7 |
+
|
8 |
+
|
9 |
+
|
10 |
+
Chart.Type.extend({
|
11 |
+
name: "Radar",
|
12 |
+
defaults:{
|
13 |
+
//Boolean - Whether to show lines for each scale point
|
14 |
+
scaleShowLine : true,
|
15 |
+
|
16 |
+
//Boolean - Whether we show the angle lines out of the radar
|
17 |
+
angleShowLineOut : true,
|
18 |
+
|
19 |
+
//Boolean - Whether to show labels on the scale
|
20 |
+
scaleShowLabels : false,
|
21 |
+
|
22 |
+
// Boolean - Whether the scale should begin at zero
|
23 |
+
scaleBeginAtZero : true,
|
24 |
+
|
25 |
+
//String - Colour of the angle line
|
26 |
+
angleLineColor : "rgba(0,0,0,.1)",
|
27 |
+
|
28 |
+
//Number - Pixel width of the angle line
|
29 |
+
angleLineWidth : 1,
|
30 |
+
|
31 |
+
//String - Point label font declaration
|
32 |
+
pointLabelFontFamily : "'Arial'",
|
33 |
+
|
34 |
+
//String - Point label font weight
|
35 |
+
pointLabelFontStyle : "normal",
|
36 |
+
|
37 |
+
//Number - Point label font size in pixels
|
38 |
+
pointLabelFontSize : 10,
|
39 |
+
|
40 |
+
//String - Point label font colour
|
41 |
+
pointLabelFontColor : "#666",
|
42 |
+
|
43 |
+
//Boolean - Whether to show a dot for each point
|
44 |
+
pointDot : true,
|
45 |
+
|
46 |
+
//Number - Radius of each point dot in pixels
|
47 |
+
pointDotRadius : 3,
|
48 |
+
|
49 |
+
//Number - Pixel width of point dot stroke
|
50 |
+
pointDotStrokeWidth : 1,
|
51 |
+
|
52 |
+
//Number - amount extra to add to the radius to cater for hit detection outside the drawn point
|
53 |
+
pointHitDetectionRadius : 20,
|
54 |
+
|
55 |
+
//Boolean - Whether to show a stroke for datasets
|
56 |
+
datasetStroke : true,
|
57 |
+
|
58 |
+
//Number - Pixel width of dataset stroke
|
59 |
+
datasetStrokeWidth : 2,
|
60 |
+
|
61 |
+
//Boolean - Whether to fill the dataset with a colour
|
62 |
+
datasetFill : true,
|
63 |
+
|
64 |
+
//String - A legend template
|
65 |
+
legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].strokeColor%>\"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>"
|
66 |
+
|
67 |
+
},
|
68 |
+
|
69 |
+
initialize: function(data){
|
70 |
+
this.PointClass = Chart.Point.extend({
|
71 |
+
strokeWidth : this.options.pointDotStrokeWidth,
|
72 |
+
radius : this.options.pointDotRadius,
|
73 |
+
display: this.options.pointDot,
|
74 |
+
hitDetectionRadius : this.options.pointHitDetectionRadius,
|
75 |
+
ctx : this.chart.ctx
|
76 |
+
});
|
77 |
+
|
78 |
+
this.datasets = [];
|
79 |
+
|
80 |
+
this.buildScale(data);
|
81 |
+
|
82 |
+
//Set up tooltip events on the chart
|
83 |
+
if (this.options.showTooltips){
|
84 |
+
helpers.bindEvents(this, this.options.tooltipEvents, function(evt){
|
85 |
+
var activePointsCollection = (evt.type !== 'mouseout') ? this.getPointsAtEvent(evt) : [];
|
86 |
+
|
87 |
+
this.eachPoints(function(point){
|
88 |
+
point.restore(['fillColor', 'strokeColor']);
|
89 |
+
});
|
90 |
+
helpers.each(activePointsCollection, function(activePoint){
|
91 |
+
activePoint.fillColor = activePoint.highlightFill;
|
92 |
+
activePoint.strokeColor = activePoint.highlightStroke;
|
93 |
+
});
|
94 |
+
|
95 |
+
this.showTooltip(activePointsCollection);
|
96 |
+
});
|
97 |
+
}
|
98 |
+
|
99 |
+
//Iterate through each of the datasets, and build this into a property of the chart
|
100 |
+
helpers.each(data.datasets,function(dataset){
|
101 |
+
|
102 |
+
var datasetObject = {
|
103 |
+
label: dataset.label || null,
|
104 |
+
fillColor : dataset.fillColor,
|
105 |
+
strokeColor : dataset.strokeColor,
|
106 |
+
pointColor : dataset.pointColor,
|
107 |
+
pointStrokeColor : dataset.pointStrokeColor,
|
108 |
+
points : []
|
109 |
+
};
|
110 |
+
|
111 |
+
this.datasets.push(datasetObject);
|
112 |
+
|
113 |
+
helpers.each(dataset.data,function(dataPoint,index){
|
114 |
+
//Add a new point for each piece of data, passing any required data to draw.
|
115 |
+
var pointPosition;
|
116 |
+
if (!this.scale.animation){
|
117 |
+
pointPosition = this.scale.getPointPosition(index, this.scale.calculateCenterOffset(dataPoint));
|
118 |
+
}
|
119 |
+
datasetObject.points.push(new this.PointClass({
|
120 |
+
value : dataPoint,
|
121 |
+
label : data.labels[index],
|
122 |
+
datasetLabel: dataset.label,
|
123 |
+
x: (this.options.animation) ? this.scale.xCenter : pointPosition.x,
|
124 |
+
y: (this.options.animation) ? this.scale.yCenter : pointPosition.y,
|
125 |
+
strokeColor : dataset.pointStrokeColor,
|
126 |
+
fillColor : dataset.pointColor,
|
127 |
+
highlightFill : dataset.pointHighlightFill || dataset.pointColor,
|
128 |
+
highlightStroke : dataset.pointHighlightStroke || dataset.pointStrokeColor
|
129 |
+
}));
|
130 |
+
},this);
|
131 |
+
|
132 |
+
},this);
|
133 |
+
|
134 |
+
this.render();
|
135 |
+
},
|
136 |
+
eachPoints : function(callback){
|
137 |
+
helpers.each(this.datasets,function(dataset){
|
138 |
+
helpers.each(dataset.points,callback,this);
|
139 |
+
},this);
|
140 |
+
},
|
141 |
+
|
142 |
+
getPointsAtEvent : function(evt){
|
143 |
+
var mousePosition = helpers.getRelativePosition(evt),
|
144 |
+
fromCenter = helpers.getAngleFromPoint({
|
145 |
+
x: this.scale.xCenter,
|
146 |
+
y: this.scale.yCenter
|
147 |
+
}, mousePosition);
|
148 |
+
|
149 |
+
var anglePerIndex = (Math.PI * 2) /this.scale.valuesCount,
|
150 |
+
pointIndex = Math.round((fromCenter.angle - Math.PI * 1.5) / anglePerIndex),
|
151 |
+
activePointsCollection = [];
|
152 |
+
|
153 |
+
// If we're at the top, make the pointIndex 0 to get the first of the array.
|
154 |
+
if (pointIndex >= this.scale.valuesCount || pointIndex < 0){
|
155 |
+
pointIndex = 0;
|
156 |
+
}
|
157 |
+
|
158 |
+
if (fromCenter.distance <= this.scale.drawingArea){
|
159 |
+
helpers.each(this.datasets, function(dataset){
|
160 |
+
activePointsCollection.push(dataset.points[pointIndex]);
|
161 |
+
});
|
162 |
+
}
|
163 |
+
|
164 |
+
return activePointsCollection;
|
165 |
+
},
|
166 |
+
|
167 |
+
buildScale : function(data){
|
168 |
+
this.scale = new Chart.RadialScale({
|
169 |
+
display: this.options.showScale,
|
170 |
+
fontStyle: this.options.scaleFontStyle,
|
171 |
+
fontSize: this.options.scaleFontSize,
|
172 |
+
fontFamily: this.options.scaleFontFamily,
|
173 |
+
fontColor: this.options.scaleFontColor,
|
174 |
+
showLabels: this.options.scaleShowLabels,
|
175 |
+
showLabelBackdrop: this.options.scaleShowLabelBackdrop,
|
176 |
+
backdropColor: this.options.scaleBackdropColor,
|
177 |
+
backdropPaddingY : this.options.scaleBackdropPaddingY,
|
178 |
+
backdropPaddingX: this.options.scaleBackdropPaddingX,
|
179 |
+
lineWidth: (this.options.scaleShowLine) ? this.options.scaleLineWidth : 0,
|
180 |
+
lineColor: this.options.scaleLineColor,
|
181 |
+
angleLineColor : this.options.angleLineColor,
|
182 |
+
angleLineWidth : (this.options.angleShowLineOut) ? this.options.angleLineWidth : 0,
|
183 |
+
// Point labels at the edge of each line
|
184 |
+
pointLabelFontColor : this.options.pointLabelFontColor,
|
185 |
+
pointLabelFontSize : this.options.pointLabelFontSize,
|
186 |
+
pointLabelFontFamily : this.options.pointLabelFontFamily,
|
187 |
+
pointLabelFontStyle : this.options.pointLabelFontStyle,
|
188 |
+
height : this.chart.height,
|
189 |
+
width: this.chart.width,
|
190 |
+
xCenter: this.chart.width/2,
|
191 |
+
yCenter: this.chart.height/2,
|
192 |
+
ctx : this.chart.ctx,
|
193 |
+
templateString: this.options.scaleLabel,
|
194 |
+
labels: data.labels,
|
195 |
+
valuesCount: data.datasets[0].data.length
|
196 |
+
});
|
197 |
+
|
198 |
+
this.scale.setScaleSize();
|
199 |
+
this.updateScaleRange(data.datasets);
|
200 |
+
this.scale.buildYLabels();
|
201 |
+
},
|
202 |
+
updateScaleRange: function(datasets){
|
203 |
+
var valuesArray = (function(){
|
204 |
+
var totalDataArray = [];
|
205 |
+
helpers.each(datasets,function(dataset){
|
206 |
+
if (dataset.data){
|
207 |
+
totalDataArray = totalDataArray.concat(dataset.data);
|
208 |
+
}
|
209 |
+
else {
|
210 |
+
helpers.each(dataset.points, function(point){
|
211 |
+
totalDataArray.push(point.value);
|
212 |
+
});
|
213 |
+
}
|
214 |
+
});
|
215 |
+
return totalDataArray;
|
216 |
+
})();
|
217 |
+
|
218 |
+
|
219 |
+
var scaleSizes = (this.options.scaleOverride) ?
|
220 |
+
{
|
221 |
+
steps: this.options.scaleSteps,
|
222 |
+
stepValue: this.options.scaleStepWidth,
|
223 |
+
min: this.options.scaleStartValue,
|
224 |
+
max: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth)
|
225 |
+
} :
|
226 |
+
helpers.calculateScaleRange(
|
227 |
+
valuesArray,
|
228 |
+
helpers.min([this.chart.width, this.chart.height])/2,
|
229 |
+
this.options.scaleFontSize,
|
230 |
+
this.options.scaleBeginAtZero,
|
231 |
+
this.options.scaleIntegersOnly
|
232 |
+
);
|
233 |
+
|
234 |
+
helpers.extend(
|
235 |
+
this.scale,
|
236 |
+
scaleSizes
|
237 |
+
);
|
238 |
+
|
239 |
+
},
|
240 |
+
addData : function(valuesArray,label){
|
241 |
+
//Map the values array for each of the datasets
|
242 |
+
this.scale.valuesCount++;
|
243 |
+
helpers.each(valuesArray,function(value,datasetIndex){
|
244 |
+
var pointPosition = this.scale.getPointPosition(this.scale.valuesCount, this.scale.calculateCenterOffset(value));
|
245 |
+
this.datasets[datasetIndex].points.push(new this.PointClass({
|
246 |
+
value : value,
|
247 |
+
label : label,
|
248 |
+
x: pointPosition.x,
|
249 |
+
y: pointPosition.y,
|
250 |
+
strokeColor : this.datasets[datasetIndex].pointStrokeColor,
|
251 |
+
fillColor : this.datasets[datasetIndex].pointColor
|
252 |
+
}));
|
253 |
+
},this);
|
254 |
+
|
255 |
+
this.scale.labels.push(label);
|
256 |
+
|
257 |
+
this.reflow();
|
258 |
+
|
259 |
+
this.update();
|
260 |
+
},
|
261 |
+
removeData : function(){
|
262 |
+
this.scale.valuesCount--;
|
263 |
+
this.scale.labels.shift();
|
264 |
+
helpers.each(this.datasets,function(dataset){
|
265 |
+
dataset.points.shift();
|
266 |
+
},this);
|
267 |
+
this.reflow();
|
268 |
+
this.update();
|
269 |
+
},
|
270 |
+
update : function(){
|
271 |
+
this.eachPoints(function(point){
|
272 |
+
point.save();
|
273 |
+
});
|
274 |
+
this.reflow();
|
275 |
+
this.render();
|
276 |
+
},
|
277 |
+
reflow: function(){
|
278 |
+
helpers.extend(this.scale, {
|
279 |
+
width : this.chart.width,
|
280 |
+
height: this.chart.height,
|
281 |
+
size : helpers.min([this.chart.width, this.chart.height]),
|
282 |
+
xCenter: this.chart.width/2,
|
283 |
+
yCenter: this.chart.height/2
|
284 |
+
});
|
285 |
+
this.updateScaleRange(this.datasets);
|
286 |
+
this.scale.setScaleSize();
|
287 |
+
this.scale.buildYLabels();
|
288 |
+
},
|
289 |
+
draw : function(ease){
|
290 |
+
var easeDecimal = ease || 1,
|
291 |
+
ctx = this.chart.ctx;
|
292 |
+
this.clear();
|
293 |
+
this.scale.draw();
|
294 |
+
|
295 |
+
helpers.each(this.datasets,function(dataset){
|
296 |
+
|
297 |
+
//Transition each point first so that the line and point drawing isn't out of sync
|
298 |
+
helpers.each(dataset.points,function(point,index){
|
299 |
+
if (point.hasValue()){
|
300 |
+
point.transition(this.scale.getPointPosition(index, this.scale.calculateCenterOffset(point.value)), easeDecimal);
|
301 |
+
}
|
302 |
+
},this);
|
303 |
+
|
304 |
+
|
305 |
+
|
306 |
+
//Draw the line between all the points
|
307 |
+
ctx.lineWidth = this.options.datasetStrokeWidth;
|
308 |
+
ctx.strokeStyle = dataset.strokeColor;
|
309 |
+
ctx.beginPath();
|
310 |
+
helpers.each(dataset.points,function(point,index){
|
311 |
+
if (index === 0){
|
312 |
+
ctx.moveTo(point.x,point.y);
|
313 |
+
}
|
314 |
+
else{
|
315 |
+
ctx.lineTo(point.x,point.y);
|
316 |
+
}
|
317 |
+
},this);
|
318 |
+
ctx.closePath();
|
319 |
+
ctx.stroke();
|
320 |
+
|
321 |
+
ctx.fillStyle = dataset.fillColor;
|
322 |
+
ctx.fill();
|
323 |
+
|
324 |
+
//Now draw the points over the line
|
325 |
+
//A little inefficient double looping, but better than the line
|
326 |
+
//lagging behind the point positions
|
327 |
+
helpers.each(dataset.points,function(point){
|
328 |
+
if (point.hasValue()){
|
329 |
+
point.draw();
|
330 |
+
}
|
331 |
+
});
|
332 |
+
|
333 |
+
},this);
|
334 |
+
|
335 |
+
}
|
336 |
+
|
337 |
+
});
|
338 |
+
|
339 |
+
|
340 |
+
|
341 |
+
|
342 |
+
|
343 |
+
}).call(this);
|
lib/bootstrap/css/bootstrap-theme.css
ADDED
@@ -0,0 +1,457 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*!
|
2 |
+
* Bootstrap v3.3.0 (http://getbootstrap.com)
|
3 |
+
* Copyright 2011-2014 Twitter, Inc.
|
4 |
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
5 |
+
*/
|
6 |
+
|
7 |
+
.btn-default,
|
8 |
+
.btn-primary,
|
9 |
+
.btn-success,
|
10 |
+
.btn-info,
|
11 |
+
.btn-warning,
|
12 |
+
.btn-danger {
|
13 |
+
text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);
|
14 |
+
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
|
15 |
+
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
|
16 |
+
}
|
17 |
+
.btn-default:active,
|
18 |
+
.btn-primary:active,
|
19 |
+
.btn-success:active,
|
20 |
+
.btn-info:active,
|
21 |
+
.btn-warning:active,
|
22 |
+
.btn-danger:active,
|
23 |
+
.btn-default.active,
|
24 |
+
.btn-primary.active,
|
25 |
+
.btn-success.active,
|
26 |
+
.btn-info.active,
|
27 |
+
.btn-warning.active,
|
28 |
+
.btn-danger.active {
|
29 |
+
-webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
|
30 |
+
box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
|
31 |
+
}
|
32 |
+
.btn-default .badge,
|
33 |
+
.btn-primary .badge,
|
34 |
+
.btn-success .badge,
|
35 |
+
.btn-info .badge,
|
36 |
+
.btn-warning .badge,
|
37 |
+
.btn-danger .badge {
|
38 |
+
text-shadow: none;
|
39 |
+
}
|
40 |
+
.btn:active,
|
41 |
+
.btn.active {
|
42 |
+
background-image: none;
|
43 |
+
}
|
44 |
+
.btn-default {
|
45 |
+
text-shadow: 0 1px 0 #fff;
|
46 |
+
background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);
|
47 |
+
background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);
|
48 |
+
background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));
|
49 |
+
background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);
|
50 |
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);
|
51 |
+
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
52 |
+
background-repeat: repeat-x;
|
53 |
+
border-color: #dbdbdb;
|
54 |
+
border-color: #ccc;
|
55 |
+
}
|
56 |
+
.btn-default:hover,
|
57 |
+
.btn-default:focus {
|
58 |
+
background-color: #e0e0e0;
|
59 |
+
background-position: 0 -15px;
|
60 |
+
}
|
61 |
+
.btn-default:active,
|
62 |
+
.btn-default.active {
|
63 |
+
background-color: #e0e0e0;
|
64 |
+
border-color: #dbdbdb;
|
65 |
+
}
|
66 |
+
.btn-default:disabled,
|
67 |
+
.btn-default[disabled] {
|
68 |
+
background-color: #e0e0e0;
|
69 |
+
background-image: none;
|
70 |
+
}
|
71 |
+
.btn-primary {
|
72 |
+
background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%);
|
73 |
+
background-image: -o-linear-gradient(top, #428bca 0%, #2d6ca2 100%);
|
74 |
+
background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#2d6ca2));
|
75 |
+
background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%);
|
76 |
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);
|
77 |
+
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
78 |
+
background-repeat: repeat-x;
|
79 |
+
border-color: #2b669a;
|
80 |
+
}
|
81 |
+
.btn-primary:hover,
|
82 |
+
.btn-primary:focus {
|
83 |
+
background-color: #2d6ca2;
|
84 |
+
background-position: 0 -15px;
|
85 |
+
}
|
86 |
+
.btn-primary:active,
|
87 |
+
.btn-primary.active {
|
88 |
+
background-color: #2d6ca2;
|
89 |
+
border-color: #2b669a;
|
90 |
+
}
|
91 |
+
.btn-primary:disabled,
|
92 |
+
.btn-primary[disabled] {
|
93 |
+
background-color: #2d6ca2;
|
94 |
+
background-image: none;
|
95 |
+
}
|
96 |
+
.btn-success {
|
97 |
+
background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);
|
98 |
+
background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);
|
99 |
+
background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));
|
100 |
+
background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);
|
101 |
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);
|
102 |
+
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
103 |
+
background-repeat: repeat-x;
|
104 |
+
border-color: #3e8f3e;
|
105 |
+
}
|
106 |
+
.btn-success:hover,
|
107 |
+
.btn-success:focus {
|
108 |
+
background-color: #419641;
|
109 |
+
background-position: 0 -15px;
|
110 |
+
}
|
111 |
+
.btn-success:active,
|
112 |
+
.btn-success.active {
|
113 |
+
background-color: #419641;
|
114 |
+
border-color: #3e8f3e;
|
115 |
+
}
|
116 |
+
.btn-success:disabled,
|
117 |
+
.btn-success[disabled] {
|
118 |
+
background-color: #419641;
|
119 |
+
background-image: none;
|
120 |
+
}
|
121 |
+
.btn-info {
|
122 |
+
background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
|
123 |
+
background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
|
124 |
+
background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));
|
125 |
+
background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);
|
126 |
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);
|
127 |
+
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
128 |
+
background-repeat: repeat-x;
|
129 |
+
border-color: #28a4c9;
|
130 |
+
}
|
131 |
+
.btn-info:hover,
|
132 |
+
.btn-info:focus {
|
133 |
+
background-color: #2aabd2;
|
134 |
+
background-position: 0 -15px;
|
135 |
+
}
|
136 |
+
.btn-info:active,
|
137 |
+
.btn-info.active {
|
138 |
+
background-color: #2aabd2;
|
139 |
+
border-color: #28a4c9;
|
140 |
+
}
|
141 |
+
.btn-info:disabled,
|
142 |
+
.btn-info[disabled] {
|
143 |
+
background-color: #2aabd2;
|
144 |
+
background-image: none;
|
145 |
+
}
|
146 |
+
.btn-warning {
|
147 |
+
background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
|
148 |
+
background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
|
149 |
+
background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));
|
150 |
+
background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);
|
151 |
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);
|
152 |
+
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
153 |
+
background-repeat: repeat-x;
|
154 |
+
border-color: #e38d13;
|
155 |
+
}
|
156 |
+
.btn-warning:hover,
|
157 |
+
.btn-warning:focus {
|
158 |
+
background-color: #eb9316;
|
159 |
+
background-position: 0 -15px;
|
160 |
+
}
|
161 |
+
.btn-warning:active,
|
162 |
+
.btn-warning.active {
|
163 |
+
background-color: #eb9316;
|
164 |
+
border-color: #e38d13;
|
165 |
+
}
|
166 |
+
.btn-warning:disabled,
|
167 |
+
.btn-warning[disabled] {
|
168 |
+
background-color: #eb9316;
|
169 |
+
background-image: none;
|
170 |
+
}
|
171 |
+
.btn-danger {
|
172 |
+
background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
|
173 |
+
background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
|
174 |
+
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));
|
175 |
+
background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);
|
176 |
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);
|
177 |
+
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
178 |
+
background-repeat: repeat-x;
|
179 |
+
border-color: #b92c28;
|
180 |
+
}
|
181 |
+
.btn-danger:hover,
|
182 |
+
.btn-danger:focus {
|
183 |
+
background-color: #c12e2a;
|
184 |
+
background-position: 0 -15px;
|
185 |
+
}
|
186 |
+
.btn-danger:active,
|
187 |
+
.btn-danger.active {
|
188 |
+
background-color: #c12e2a;
|
189 |
+
border-color: #b92c28;
|
190 |
+
}
|
191 |
+
.btn-danger:disabled,
|
192 |
+
.btn-danger[disabled] {
|
193 |
+
background-color: #c12e2a;
|
194 |
+
background-image: none;
|
195 |
+
}
|
196 |
+
.thumbnail,
|
197 |
+
.img-thumbnail {
|
198 |
+
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
|
199 |
+
box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
|
200 |
+
}
|
201 |
+
.dropdown-menu > li > a:hover,
|
202 |
+
.dropdown-menu > li > a:focus {
|
203 |
+
background-color: #e8e8e8;
|
204 |
+
background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
|
205 |
+
background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
|
206 |
+
background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
|
207 |
+
background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
|
208 |
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
|
209 |
+
background-repeat: repeat-x;
|
210 |
+
}
|
211 |
+
.dropdown-menu > .active > a,
|
212 |
+
.dropdown-menu > .active > a:hover,
|
213 |
+
.dropdown-menu > .active > a:focus {
|
214 |
+
background-color: #357ebd;
|
215 |
+
background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);
|
216 |
+
background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%);
|
217 |
+
background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd));
|
218 |
+
background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);
|
219 |
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);
|
220 |
+
background-repeat: repeat-x;
|
221 |
+
}
|
222 |
+
.navbar-default {
|
223 |
+
background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);
|
224 |
+
background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%);
|
225 |
+
background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));
|
226 |
+
background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);
|
227 |
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);
|
228 |
+
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
229 |
+
background-repeat: repeat-x;
|
230 |
+
border-radius: 4px;
|
231 |
+
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
|
232 |
+
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
|
233 |
+
}
|
234 |
+
.navbar-default .navbar-nav > .open > a,
|
235 |
+
.navbar-default .navbar-nav > .active > a {
|
236 |
+
background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
|
237 |
+
background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
|
238 |
+
background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));
|
239 |
+
background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);
|
240 |
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);
|
241 |
+
background-repeat: repeat-x;
|
242 |
+
-webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
|
243 |
+
box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
|
244 |
+
}
|
245 |
+
.navbar-brand,
|
246 |
+
.navbar-nav > li > a {
|
247 |
+
text-shadow: 0 1px 0 rgba(255, 255, 255, .25);
|
248 |
+
}
|
249 |
+
.navbar-inverse {
|
250 |
+
background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);
|
251 |
+
background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);
|
252 |
+
background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));
|
253 |
+
background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);
|
254 |
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);
|
255 |
+
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
256 |
+
background-repeat: repeat-x;
|
257 |
+
}
|
258 |
+
.navbar-inverse .navbar-nav > .open > a,
|
259 |
+
.navbar-inverse .navbar-nav > .active > a {
|
260 |
+
background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);
|
261 |
+
background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);
|
262 |
+
background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));
|
263 |
+
background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);
|
264 |
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);
|
265 |
+
background-repeat: repeat-x;
|
266 |
+
-webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
|
267 |
+
box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
|
268 |
+
}
|
269 |
+
.navbar-inverse .navbar-brand,
|
270 |
+
.navbar-inverse .navbar-nav > li > a {
|
271 |
+
text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);
|
272 |
+
}
|
273 |
+
.navbar-static-top,
|
274 |
+
.navbar-fixed-top,
|
275 |
+
.navbar-fixed-bottom {
|
276 |
+
border-radius: 0;
|
277 |
+
}
|
278 |
+
.alert {
|
279 |
+
text-shadow: 0 1px 0 rgba(255, 255, 255, .2);
|
280 |
+
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
|
281 |
+
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
|
282 |
+
}
|
283 |
+
.alert-success {
|
284 |
+
background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
|
285 |
+
background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
|
286 |
+
background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));
|
287 |
+
background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
|
288 |
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
|
289 |
+
background-repeat: repeat-x;
|
290 |
+
border-color: #b2dba1;
|
291 |
+
}
|
292 |
+
.alert-info {
|
293 |
+
background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
|
294 |
+
background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
|
295 |
+
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));
|
296 |
+
background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
|
297 |
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);
|
298 |
+
background-repeat: repeat-x;
|
299 |
+
border-color: #9acfea;
|
300 |
+
}
|
301 |
+
.alert-warning {
|
302 |
+
background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
|
303 |
+
background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
|
304 |
+
background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));
|
305 |
+
background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
|
306 |
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);
|
307 |
+
background-repeat: repeat-x;
|
308 |
+
border-color: #f5e79e;
|
309 |
+
}
|
310 |
+
.alert-danger {
|
311 |
+
background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
|
312 |
+
background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
|
313 |
+
background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));
|
314 |
+
background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
|
315 |
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);
|
316 |
+
background-repeat: repeat-x;
|
317 |
+
border-color: #dca7a7;
|
318 |
+
}
|
319 |
+
.progress {
|
320 |
+
background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
|
321 |
+
background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
|
322 |
+
background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));
|
323 |
+
background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);
|
324 |
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);
|
325 |
+
background-repeat: repeat-x;
|
326 |
+
}
|
327 |
+
.progress-bar {
|
328 |
+
background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%);
|
329 |
+
background-image: -o-linear-gradient(top, #428bca 0%, #3071a9 100%);
|
330 |
+
background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3071a9));
|
331 |
+
background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%);
|
332 |
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);
|
333 |
+
background-repeat: repeat-x;
|
334 |
+
}
|
335 |
+
.progress-bar-success {
|
336 |
+
background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);
|
337 |
+
background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);
|
338 |
+
background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));
|
339 |
+
background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);
|
340 |
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);
|
341 |
+
background-repeat: repeat-x;
|
342 |
+
}
|
343 |
+
.progress-bar-info {
|
344 |
+
background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
|
345 |
+
background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
|
346 |
+
background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));
|
347 |
+
background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);
|
348 |
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);
|
349 |
+
background-repeat: repeat-x;
|
350 |
+
}
|
351 |
+
.progress-bar-warning {
|
352 |
+
background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
|
353 |
+
background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
|
354 |
+
background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));
|
355 |
+
background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);
|
356 |
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);
|
357 |
+
background-repeat: repeat-x;
|
358 |
+
}
|
359 |
+
.progress-bar-danger {
|
360 |
+
background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);
|
361 |
+
background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);
|
362 |
+
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));
|
363 |
+
background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
|
364 |
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);
|
365 |
+
background-repeat: repeat-x;
|
366 |
+
}
|
367 |
+
.progress-bar-striped {
|
368 |
+
background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
|
369 |
+
background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
|
370 |
+
background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
|
371 |
+
}
|
372 |
+
.list-group {
|
373 |
+
border-radius: 4px;
|
374 |
+
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
|
375 |
+
box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
|
376 |
+
}
|
377 |
+
.list-group-item.active,
|
378 |
+
.list-group-item.active:hover,
|
379 |
+
.list-group-item.active:focus {
|
380 |
+
text-shadow: 0 -1px 0 #3071a9;
|
381 |
+
background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%);
|
382 |
+
background-image: -o-linear-gradient(top, #428bca 0%, #3278b3 100%);
|
383 |
+
background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3278b3));
|
384 |
+
background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%);
|
385 |
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);
|
386 |
+
background-repeat: repeat-x;
|
387 |
+
border-color: #3278b3;
|
388 |
+
}
|
389 |
+
.list-group-item.active .badge,
|
390 |
+
.list-group-item.active:hover .badge,
|
391 |
+
.list-group-item.active:focus .badge {
|
392 |
+
text-shadow: none;
|
393 |
+
}
|
394 |
+
.panel {
|
395 |
+
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
|
396 |
+
box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
|
397 |
+
}
|
398 |
+
.panel-default > .panel-heading {
|
399 |
+
background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
|
400 |
+
background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
|
401 |
+
background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
|
402 |
+
background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
|
403 |
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
|
404 |
+
background-repeat: repeat-x;
|
405 |
+
}
|
406 |
+
.panel-primary > .panel-heading {
|
407 |
+
background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);
|
408 |
+
background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%);
|
409 |
+
background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd));
|
410 |
+
background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);
|
411 |
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);
|
412 |
+
background-repeat: repeat-x;
|
413 |
+
}
|
414 |
+
.panel-success > .panel-heading {
|
415 |
+
background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
|
416 |
+
background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
|
417 |
+
background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));
|
418 |
+
background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);
|
419 |
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);
|
420 |
+
background-repeat: repeat-x;
|
421 |
+
}
|
422 |
+
.panel-info > .panel-heading {
|
423 |
+
background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
|
424 |
+
background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
|
425 |
+
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));
|
426 |
+
background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);
|
427 |
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);
|
428 |
+
background-repeat: repeat-x;
|
429 |
+
}
|
430 |
+
.panel-warning > .panel-heading {
|
431 |
+
background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
|
432 |
+
background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
|
433 |
+
background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));
|
434 |
+
background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);
|
435 |
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);
|
436 |
+
background-repeat: repeat-x;
|
437 |
+
}
|
438 |
+
.panel-danger > .panel-heading {
|
439 |
+
background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
|
440 |
+
background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
|
441 |
+
background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));
|
442 |
+
background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);
|
443 |
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);
|
444 |
+
background-repeat: repeat-x;
|
445 |
+
}
|
446 |
+
.well {
|
447 |
+
background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
|
448 |
+
background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
|
449 |
+
background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));
|
450 |
+
background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);
|
451 |
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);
|
452 |
+
background-repeat: repeat-x;
|
453 |
+
border-color: #dcdcdc;
|
454 |
+
-webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
|
455 |
+
box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
|
456 |
+
}
|
457 |
+
/*# sourceMappingURL=bootstrap-theme.css.map */
|
lib/bootstrap/css/bootstrap-theme.css.map
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
{"version":3,"sources":["less/theme.less","less/mixins/vendor-prefixes.less","bootstrap-theme.css","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"AAcA;;;;;;EAME,0CAAA;ECgDA,6FAAA;EACQ,qFAAA;EC5DT;AFgBC;;;;;;;;;;;;EC2CA,0DAAA;EACQ,kDAAA;EC7CT;AFVD;;;;;;EAiBI,mBAAA;EECH;AFgCC;;EAEE,wBAAA;EE9BH;AFmCD;EGlDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EA+B2C,2BAAA;EAA2B,oBAAA;EExBvE;AFLC;;EAEE,2BAAA;EACA,8BAAA;EEOH;AFJC;;EAEE,2BAAA;EACA,uBAAA;EEMH;AFHC;;EAEE,2BAAA;EACA,wBAAA;EEKH;AFUD;EGnDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EE+BD;AF7BC;;EAEE,2BAAA;EACA,8BAAA;EE+BH;AF5BC;;EAEE,2BAAA;EACA,uBAAA;EE8BH;AF3BC;;EAEE,2BAAA;EACA,wBAAA;EE6BH;AFbD;EGpDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EEuDD;AFrDC;;EAEE,2BAAA;EACA,8BAAA;EEuDH;AFpDC;;EAEE,2BAAA;EACA,uBAAA;EEsDH;AFnDC;;EAEE,2BAAA;EACA,wBAAA;EEqDH;AFpCD;EGrDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EE+ED;AF7EC;;EAEE,2BAAA;EACA,8BAAA;EE+EH;AF5EC;;EAEE,2BAAA;EACA,uBAAA;EE8EH;AF3EC;;EAEE,2BAAA;EACA,wBAAA;EE6EH;AF3DD;EGtDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EEuGD;AFrGC;;EAEE,2BAAA;EACA,8BAAA;EEuGH;AFpGC;;EAEE,2BAAA;EACA,uBAAA;EEsGH;AFnGC;;EAEE,2BAAA;EACA,wBAAA;EEqGH;AFlFD;EGvDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJiCA,6BAAA;EACA,uBAAA;EE+HD;AF7HC;;EAEE,2BAAA;EACA,8BAAA;EE+HH;AF5HC;;EAEE,2BAAA;EACA,uBAAA;EE8HH;AF3HC;;EAEE,2BAAA;EACA,wBAAA;EE6HH;AFnGD;;ECfE,oDAAA;EACQ,4CAAA;ECsHT;AF9FD;;EGxEI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EHuEF,2BAAA;EEoGD;AFlGD;;;EG7EI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH6EF,2BAAA;EEwGD;AF/FD;EG1FI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ECnBF,qEAAA;EJ4GA,oBAAA;EC9CA,6FAAA;EACQ,qFAAA;ECoJT;AF1GD;;EG1FI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EF2CF,0DAAA;EACQ,kDAAA;EC8JT;AFvGD;;EAEE,gDAAA;EEyGD;AFrGD;EG7GI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ECnBF,qEAAA;EFyOD;AF7GD;;EG7GI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EF2CF,yDAAA;EACQ,iDAAA;ECoLT;AFvHD;;EAYI,2CAAA;EE+GH;AF1GD;;;EAGE,kBAAA;EE4GD;AFnGD;EACE,+CAAA;EC5FA,4FAAA;EACQ,oFAAA;ECkMT;AF3FD;EGvJI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH+IF,uBAAA;EEuGD;AFlGD;EGxJI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH+IF,uBAAA;EE+GD;AFzGD;EGzJI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH+IF,uBAAA;EEuHD;AFhHD;EG1JI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH+IF,uBAAA;EE+HD;AFhHD;EGlKI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDqRH;AF7GD;EG5KI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED4RH;AFnHD;EG7KI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDmSH;AFzHD;EG9KI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED0SH;AF/HD;EG/KI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDiTH;AFrID;EGhLI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDwTH;AFxID;EGnJI,+MAAA;EACA,0MAAA;EACA,uMAAA;ED8RH;AFpID;EACE,oBAAA;EC/IA,oDAAA;EACQ,4CAAA;ECsRT;AFrID;;;EAGE,+BAAA;EGpME,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EHkMF,uBAAA;EE2ID;AFhJD;;;EAQI,mBAAA;EE6IH;AFnID;ECpKE,mDAAA;EACQ,2CAAA;EC0ST;AF7HD;EG7NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED6VH;AFnID;EG9NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDoWH;AFzID;EG/NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED2WH;AF/ID;EGhOI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDkXH;AFrJD;EGjOI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDyXH;AF3JD;EGlOI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDgYH;AF3JD;EGzOI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EHuOF,uBAAA;EC5LA,2FAAA;EACQ,mFAAA;EC8VT","file":"bootstrap-theme.css","sourcesContent":["\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &:disabled,\n &[disabled] {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // See https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n",".btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #e0e0e0 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default:disabled,\n.btn-default[disabled] {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%);\n background-image: -o-linear-gradient(top, #428bca 0%, #2d6ca2 100%);\n background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #2b669a;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #2d6ca2;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #2d6ca2;\n border-color: #2b669a;\n}\n.btn-primary:disabled,\n.btn-primary[disabled] {\n background-color: #2d6ca2;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success:disabled,\n.btn-success[disabled] {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info:disabled,\n.btn-info[disabled] {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning:disabled,\n.btn-warning[disabled] {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger:disabled,\n.btn-danger[disabled] {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);\n background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%);\n background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);\n background-color: #357ebd;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222222 100%);\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%);\n background-image: -o-linear-gradient(top, #428bca 0%, #3071a9 100%);\n background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n}\n.progress-bar-striped {\n 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);\n 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);\n 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);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #3071a9;\n background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%);\n background-image: -o-linear-gradient(top, #428bca 0%, #3278b3 100%);\n background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);\n border-color: #3278b3;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);\n background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%);\n background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]}
|
lib/bootstrap/css/bootstrap-theme.min.css
ADDED
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*!
|
2 |
+
* Bootstrap v3.3.0 (http://getbootstrap.com)
|
3 |
+
* Copyright 2011-2014 Twitter, Inc.
|
4 |
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
5 |
+
*/.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(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,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.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{text-shadow:0 1px 0 #fff;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,from(#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;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]{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:-o-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#2d6ca2));background-image:linear-gradient(to bottom,#428bca 0,#2d6ca2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#2b669a}.btn-primary:hover,.btn-primary:focus{background-color:#2d6ca2;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#2d6ca2;border-color:#2b669a}.btn-primary:disabled,.btn-primary[disabled]{background-color:#2d6ca2;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,from(#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]{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,from(#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]{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,from(#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]{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,from(#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]{background-color:#c12e2a;background-image:none}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-color:#e8e8e8;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,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#357ebd;background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-o-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#357ebd));background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-repeat:repeat-x}.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,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(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,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.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,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x}.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,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(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,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;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,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;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,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;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,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;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,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:-o-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#3071a9));background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);background-repeat:repeat-x}.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,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.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,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.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,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.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,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:-o-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#3278b3));background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);background-repeat:repeat-x;border-color:#3278b3}.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,.05);box-shadow:0 1px 2px rgba(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,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-o-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#357ebd));background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-repeat:repeat-x}.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,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.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,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.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,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.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,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.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,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)}
|
lib/bootstrap/css/bootstrap.css
ADDED
@@ -0,0 +1,6358 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*!
|
2 |
+
* Bootstrap v3.3.0 (http://getbootstrap.com)
|
3 |
+
* Copyright 2011-2014 Twitter, Inc.
|
4 |
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
5 |
+
*/
|
6 |
+
|
7 |
+
/*! normalize.css v3.0.2 | MIT License | git.io/normalize */
|
8 |
+
html {
|
9 |
+
font-family: sans-serif;
|
10 |
+
-webkit-text-size-adjust: 100%;
|
11 |
+
-ms-text-size-adjust: 100%;
|
12 |
+
}
|
13 |
+
body {
|
14 |
+
margin: 0;
|
15 |
+
}
|
16 |
+
article,
|
17 |
+
aside,
|
18 |
+
details,
|
19 |
+
figcaption,
|
20 |
+
figure,
|
21 |
+
footer,
|
22 |
+
header,
|
23 |
+
hgroup,
|
24 |
+
main,
|
25 |
+
menu,
|
26 |
+
nav,
|
27 |
+
section,
|
28 |
+
summary {
|
29 |
+
display: block;
|
30 |
+
}
|
31 |
+
audio,
|
32 |
+
canvas,
|
33 |
+
progress,
|
34 |
+
video {
|
35 |
+
display: inline-block;
|
36 |
+
vertical-align: baseline;
|
37 |
+
}
|
38 |
+
audio:not([controls]) {
|
39 |
+
display: none;
|
40 |
+
height: 0;
|
41 |
+
}
|
42 |
+
[hidden],
|
43 |
+
template {
|
44 |
+
display: none;
|
45 |
+
}
|
46 |
+
a {
|
47 |
+
background-color: transparent;
|
48 |
+
}
|
49 |
+
a:active,
|
50 |
+
a:hover {
|
51 |
+
outline: 0;
|
52 |
+
}
|
53 |
+
abbr[title] {
|
54 |
+
border-bottom: 1px dotted;
|
55 |
+
}
|
56 |
+
b,
|
57 |
+
strong {
|
58 |
+
font-weight: bold;
|
59 |
+
}
|
60 |
+
dfn {
|
61 |
+
font-style: italic;
|
62 |
+
}
|
63 |
+
h1 {
|
64 |
+
margin: .67em 0;
|
65 |
+
font-size: 2em;
|
66 |
+
}
|
67 |
+
mark {
|
68 |
+
color: #000;
|
69 |
+
background: #ff0;
|
70 |
+
}
|
71 |
+
small {
|
72 |
+
font-size: 80%;
|
73 |
+
}
|
74 |
+
sub,
|
75 |
+
sup {
|
76 |
+
position: relative;
|
77 |
+
font-size: 75%;
|
78 |
+
line-height: 0;
|
79 |
+
vertical-align: baseline;
|
80 |
+
}
|
81 |
+
sup {
|
82 |
+
top: -.5em;
|
83 |
+
}
|
84 |
+
sub {
|
85 |
+
bottom: -.25em;
|
86 |
+
}
|
87 |
+
img {
|
88 |
+
border: 0;
|
89 |
+
}
|
90 |
+
svg:not(:root) {
|
91 |
+
overflow: hidden;
|
92 |
+
}
|
93 |
+
figure {
|
94 |
+
margin: 1em 40px;
|
95 |
+
}
|
96 |
+
hr {
|
97 |
+
height: 0;
|
98 |
+
-webkit-box-sizing: content-box;
|
99 |
+
-moz-box-sizing: content-box;
|
100 |
+
box-sizing: content-box;
|
101 |
+
}
|
102 |
+
pre {
|
103 |
+
overflow: auto;
|
104 |
+
}
|
105 |
+
code,
|
106 |
+
kbd,
|
107 |
+
pre,
|
108 |
+
samp {
|
109 |
+
font-family: monospace, monospace;
|
110 |
+
font-size: 1em;
|
111 |
+
}
|
112 |
+
button,
|
113 |
+
input,
|
114 |
+
optgroup,
|
115 |
+
select,
|
116 |
+
textarea {
|
117 |
+
margin: 0;
|
118 |
+
font: inherit;
|
119 |
+
color: inherit;
|
120 |
+
}
|
121 |
+
button {
|
122 |
+
overflow: visible;
|
123 |
+
}
|
124 |
+
button,
|
125 |
+
select {
|
126 |
+
text-transform: none;
|
127 |
+
}
|
128 |
+
button,
|
129 |
+
html input[type="button"],
|
130 |
+
input[type="reset"],
|
131 |
+
input[type="submit"] {
|
132 |
+
-webkit-appearance: button;
|
133 |
+
cursor: pointer;
|
134 |
+
}
|
135 |
+
button[disabled],
|
136 |
+
html input[disabled] {
|
137 |
+
cursor: default;
|
138 |
+
}
|
139 |
+
button::-moz-focus-inner,
|
140 |
+
input::-moz-focus-inner {
|
141 |
+
padding: 0;
|
142 |
+
border: 0;
|
143 |
+
}
|
144 |
+
input {
|
145 |
+
line-height: normal;
|
146 |
+
}
|
147 |
+
input[type="checkbox"],
|
148 |
+
input[type="radio"] {
|
149 |
+
-webkit-box-sizing: border-box;
|
150 |
+
-moz-box-sizing: border-box;
|
151 |
+
box-sizing: border-box;
|
152 |
+
padding: 0;
|
153 |
+
}
|
154 |
+
input[type="number"]::-webkit-inner-spin-button,
|
155 |
+
input[type="number"]::-webkit-outer-spin-button {
|
156 |
+
height: auto;
|
157 |
+
}
|
158 |
+
input[type="search"] {
|
159 |
+
-webkit-box-sizing: content-box;
|
160 |
+
-moz-box-sizing: content-box;
|
161 |
+
box-sizing: content-box;
|
162 |
+
-webkit-appearance: textfield;
|
163 |
+
}
|
164 |
+
input[type="search"]::-webkit-search-cancel-button,
|
165 |
+
input[type="search"]::-webkit-search-decoration {
|
166 |
+
-webkit-appearance: none;
|
167 |
+
}
|
168 |
+
fieldset {
|
169 |
+
padding: .35em .625em .75em;
|
170 |
+
margin: 0 2px;
|
171 |
+
border: 1px solid #c0c0c0;
|
172 |
+
}
|
173 |
+
legend {
|
174 |
+
padding: 0;
|
175 |
+
border: 0;
|
176 |
+
}
|
177 |
+
textarea {
|
178 |
+
overflow: auto;
|
179 |
+
}
|
180 |
+
optgroup {
|
181 |
+
font-weight: bold;
|
182 |
+
}
|
183 |
+
table {
|
184 |
+
border-spacing: 0;
|
185 |
+
border-collapse: collapse;
|
186 |
+
}
|
187 |
+
td,
|
188 |
+
th {
|
189 |
+
padding: 0;
|
190 |
+
}
|
191 |
+
/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */
|
192 |
+
@media print {
|
193 |
+
*,
|
194 |
+
*:before,
|
195 |
+
*:after {
|
196 |
+
color: #000 !important;
|
197 |
+
text-shadow: none !important;
|
198 |
+
background: transparent !important;
|
199 |
+
-webkit-box-shadow: none !important;
|
200 |
+
box-shadow: none !important;
|
201 |
+
}
|
202 |
+
a,
|
203 |
+
a:visited {
|
204 |
+
text-decoration: underline;
|
205 |
+
}
|
206 |
+
a[href]:after {
|
207 |
+
content: " (" attr(href) ")";
|
208 |
+
}
|
209 |
+
abbr[title]:after {
|
210 |
+
content: " (" attr(title) ")";
|
211 |
+
}
|
212 |
+
a[href^="#"]:after,
|
213 |
+
a[href^="javascript:"]:after {
|
214 |
+
content: "";
|
215 |
+
}
|
216 |
+
pre,
|
217 |
+
blockquote {
|
218 |
+
border: 1px solid #999;
|
219 |
+
|
220 |
+
page-break-inside: avoid;
|
221 |
+
}
|
222 |
+
thead {
|
223 |
+
display: table-header-group;
|
224 |
+
}
|
225 |
+
tr,
|
226 |
+
img {
|
227 |
+
page-break-inside: avoid;
|
228 |
+
}
|
229 |
+
img {
|
230 |
+
max-width: 100% !important;
|
231 |
+
}
|
232 |
+
p,
|
233 |
+
h2,
|
234 |
+
h3 {
|
235 |
+
orphans: 3;
|
236 |
+
widows: 3;
|
237 |
+
}
|
238 |
+
h2,
|
239 |
+
h3 {
|
240 |
+
page-break-after: avoid;
|
241 |
+
}
|
242 |
+
select {
|
243 |
+
background: #fff !important;
|
244 |
+
}
|
245 |
+
.navbar {
|
246 |
+
display: none;
|
247 |
+
}
|
248 |
+
.btn > .caret,
|
249 |
+
.dropup > .btn > .caret {
|
250 |
+
border-top-color: #000 !important;
|
251 |
+
}
|
252 |
+
.label {
|
253 |
+
border: 1px solid #000;
|
254 |
+
}
|
255 |
+
.table {
|
256 |
+
border-collapse: collapse !important;
|
257 |
+
}
|
258 |
+
.table td,
|
259 |
+
.table th {
|
260 |
+
background-color: #fff !important;
|
261 |
+
}
|
262 |
+
.table-bordered th,
|
263 |
+
.table-bordered td {
|
264 |
+
border: 1px solid #ddd !important;
|
265 |
+
}
|
266 |
+
}
|
267 |
+
@font-face {
|
268 |
+
font-family: 'Glyphicons Halflings';
|
269 |
+
|
270 |
+
src: url('../fonts/glyphicons-halflings-regular.eot');
|
271 |
+
src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');
|
272 |
+
}
|
273 |
+
.glyphicon {
|
274 |
+
position: relative;
|
275 |
+
top: 1px;
|
276 |
+
display: inline-block;
|
277 |
+
font-family: 'Glyphicons Halflings';
|
278 |
+
font-style: normal;
|
279 |
+
font-weight: normal;
|
280 |
+
line-height: 1;
|
281 |
+
|
282 |
+
-webkit-font-smoothing: antialiased;
|
283 |
+
-moz-osx-font-smoothing: grayscale;
|
284 |
+
}
|
285 |
+
.glyphicon-asterisk:before {
|
286 |
+
content: "\2a";
|
287 |
+
}
|
288 |
+
.glyphicon-plus:before {
|
289 |
+
content: "\2b";
|
290 |
+
}
|
291 |
+
.glyphicon-euro:before,
|
292 |
+
.glyphicon-eur:before {
|
293 |
+
content: "\20ac";
|
294 |
+
}
|
295 |
+
.glyphicon-minus:before {
|
296 |
+
content: "\2212";
|
297 |
+
}
|
298 |
+
.glyphicon-cloud:before {
|
299 |
+
content: "\2601";
|
300 |
+
}
|
301 |
+
.glyphicon-envelope:before {
|
302 |
+
content: "\2709";
|
303 |
+
}
|
304 |
+
.glyphicon-pencil:before {
|
305 |
+
content: "\270f";
|
306 |
+
}
|
307 |
+
.glyphicon-glass:before {
|
308 |
+
content: "\e001";
|
309 |
+
}
|
310 |
+
.glyphicon-music:before {
|
311 |
+
content: "\e002";
|
312 |
+
}
|
313 |
+
.glyphicon-search:before {
|
314 |
+
content: "\e003";
|
315 |
+
}
|
316 |
+
.glyphicon-heart:before {
|
317 |
+
content: "\e005";
|
318 |
+
}
|
319 |
+
.glyphicon-star:before {
|
320 |
+
content: "\e006";
|
321 |
+
}
|
322 |
+
.glyphicon-star-empty:before {
|
323 |
+
content: "\e007";
|
324 |
+
}
|
325 |
+
.glyphicon-user:before {
|
326 |
+
content: "\e008";
|
327 |
+
}
|
328 |
+
.glyphicon-film:before {
|
329 |
+
content: "\e009";
|
330 |
+
}
|
331 |
+
.glyphicon-th-large:before {
|
332 |
+
content: "\e010";
|
333 |
+
}
|
334 |
+
.glyphicon-th:before {
|
335 |
+
content: "\e011";
|
336 |
+
}
|
337 |
+
.glyphicon-th-list:before {
|
338 |
+
content: "\e012";
|
339 |
+
}
|
340 |
+
.glyphicon-ok:before {
|
341 |
+
content: "\e013";
|
342 |
+
}
|
343 |
+
.glyphicon-remove:before {
|
344 |
+
content: "\e014";
|
345 |
+
}
|
346 |
+
.glyphicon-zoom-in:before {
|
347 |
+
content: "\e015";
|
348 |
+
}
|
349 |
+
.glyphicon-zoom-out:before {
|
350 |
+
content: "\e016";
|
351 |
+
}
|
352 |
+
.glyphicon-off:before {
|
353 |
+
content: "\e017";
|
354 |
+
}
|
355 |
+
.glyphicon-signal:before {
|
356 |
+
content: "\e018";
|
357 |
+
}
|
358 |
+
.glyphicon-cog:before {
|
359 |
+
content: "\e019";
|
360 |
+
}
|
361 |
+
.glyphicon-trash:before {
|
362 |
+
content: "\e020";
|
363 |
+
}
|
364 |
+
.glyphicon-home:before {
|
365 |
+
content: "\e021";
|
366 |
+
}
|
367 |
+
.glyphicon-file:before {
|
368 |
+
content: "\e022";
|
369 |
+
}
|
370 |
+
.glyphicon-time:before {
|
371 |
+
content: "\e023";
|
372 |
+
}
|
373 |
+
.glyphicon-road:before {
|
374 |
+
content: "\e024";
|
375 |
+
}
|
376 |
+
.glyphicon-download-alt:before {
|
377 |
+
content: "\e025";
|
378 |
+
}
|
379 |
+
.glyphicon-download:before {
|
380 |
+
content: "\e026";
|
381 |
+
}
|
382 |
+
.glyphicon-upload:before {
|
383 |
+
content: "\e027";
|
384 |
+
}
|
385 |
+
.glyphicon-inbox:before {
|
386 |
+
content: "\e028";
|
387 |
+
}
|
388 |
+
.glyphicon-play-circle:before {
|
389 |
+
content: "\e029";
|
390 |
+
}
|
391 |
+
.glyphicon-repeat:before {
|
392 |
+
content: "\e030";
|
393 |
+
}
|
394 |
+
.glyphicon-refresh:before {
|
395 |
+
content: "\e031";
|
396 |
+
}
|
397 |
+
.glyphicon-list-alt:before {
|
398 |
+
content: "\e032";
|
399 |
+
}
|
400 |
+
.glyphicon-lock:before {
|
401 |
+
content: "\e033";
|
402 |
+
}
|
403 |
+
.glyphicon-flag:before {
|
404 |
+
content: "\e034";
|
405 |
+
}
|
406 |
+
.glyphicon-headphones:before {
|
407 |
+
content: "\e035";
|
408 |
+
}
|
409 |
+
.glyphicon-volume-off:before {
|
410 |
+
content: "\e036";
|
411 |
+
}
|
412 |
+
.glyphicon-volume-down:before {
|
413 |
+
content: "\e037";
|
414 |
+
}
|
415 |
+
.glyphicon-volume-up:before {
|
416 |
+
content: "\e038";
|
417 |
+
}
|
418 |
+
.glyphicon-qrcode:before {
|
419 |
+
content: "\e039";
|
420 |
+
}
|
421 |
+
.glyphicon-barcode:before {
|
422 |
+
content: "\e040";
|
423 |
+
}
|
424 |
+
.glyphicon-tag:before {
|
425 |
+
content: "\e041";
|
426 |
+
}
|
427 |
+
.glyphicon-tags:before {
|
428 |
+
content: "\e042";
|
429 |
+
}
|
430 |
+
.glyphicon-book:before {
|
431 |
+
content: "\e043";
|
432 |
+
}
|
433 |
+
.glyphicon-bookmark:before {
|
434 |
+
content: "\e044";
|
435 |
+
}
|
436 |
+
.glyphicon-print:before {
|
437 |
+
content: "\e045";
|
438 |
+
}
|
439 |
+
.glyphicon-camera:before {
|
440 |
+
content: "\e046";
|
441 |
+
}
|
442 |
+
.glyphicon-font:before {
|
443 |
+
content: "\e047";
|
444 |
+
}
|
445 |
+
.glyphicon-bold:before {
|
446 |
+
content: "\e048";
|
447 |
+
}
|
448 |
+
.glyphicon-italic:before {
|
449 |
+
content: "\e049";
|
450 |
+
}
|
451 |
+
.glyphicon-text-height:before {
|
452 |
+
content: "\e050";
|
453 |
+
}
|
454 |
+
.glyphicon-text-width:before {
|
455 |
+
content: "\e051";
|
456 |
+
}
|
457 |
+
.glyphicon-align-left:before {
|
458 |
+
content: "\e052";
|
459 |
+
}
|
460 |
+
.glyphicon-align-center:before {
|
461 |
+
content: "\e053";
|
462 |
+
}
|
463 |
+
.glyphicon-align-right:before {
|
464 |
+
content: "\e054";
|
465 |
+
}
|
466 |
+
.glyphicon-align-justify:before {
|
467 |
+
content: "\e055";
|
468 |
+
}
|
469 |
+
.glyphicon-list:before {
|
470 |
+
content: "\e056";
|
471 |
+
}
|
472 |
+
.glyphicon-indent-left:before {
|
473 |
+
content: "\e057";
|
474 |
+
}
|
475 |
+
.glyphicon-indent-right:before {
|
476 |
+
content: "\e058";
|
477 |
+
}
|
478 |
+
.glyphicon-facetime-video:before {
|
479 |
+
content: "\e059";
|
480 |
+
}
|
481 |
+
.glyphicon-picture:before {
|
482 |
+
content: "\e060";
|
483 |
+
}
|
484 |
+
.glyphicon-map-marker:before {
|
485 |
+
content: "\e062";
|
486 |
+
}
|
487 |
+
.glyphicon-adjust:before {
|
488 |
+
content: "\e063";
|
489 |
+
}
|
490 |
+
.glyphicon-tint:before {
|
491 |
+
content: "\e064";
|
492 |
+
}
|
493 |
+
.glyphicon-edit:before {
|
494 |
+
content: "\e065";
|
495 |
+
}
|
496 |
+
.glyphicon-share:before {
|
497 |
+
content: "\e066";
|
498 |
+
}
|
499 |
+
.glyphicon-check:before {
|
500 |
+
content: "\e067";
|
501 |
+
}
|
502 |
+
.glyphicon-move:before {
|
503 |
+
content: "\e068";
|
504 |
+
}
|
505 |
+
.glyphicon-step-backward:before {
|
506 |
+
content: "\e069";
|
507 |
+
}
|
508 |
+
.glyphicon-fast-backward:before {
|
509 |
+
content: "\e070";
|
510 |
+
}
|
511 |
+
.glyphicon-backward:before {
|
512 |
+
content: "\e071";
|
513 |
+
}
|
514 |
+
.glyphicon-play:before {
|
515 |
+
content: "\e072";
|
516 |
+
}
|
517 |
+
.glyphicon-pause:before {
|
518 |
+
content: "\e073";
|
519 |
+
}
|
520 |
+
.glyphicon-stop:before {
|
521 |
+
content: "\e074";
|
522 |
+
}
|
523 |
+
.glyphicon-forward:before {
|
524 |
+
content: "\e075";
|
525 |
+
}
|
526 |
+
.glyphicon-fast-forward:before {
|
527 |
+
content: "\e076";
|
528 |
+
}
|
529 |
+
.glyphicon-step-forward:before {
|
530 |
+
content: "\e077";
|
531 |
+
}
|
532 |
+
.glyphicon-eject:before {
|
533 |
+
content: "\e078";
|
534 |
+
}
|
535 |
+
.glyphicon-chevron-left:before {
|
536 |
+
content: "\e079";
|
537 |
+
}
|
538 |
+
.glyphicon-chevron-right:before {
|
539 |
+
content: "\e080";
|
540 |
+
}
|
541 |
+
.glyphicon-plus-sign:before {
|
542 |
+
content: "\e081";
|
543 |
+
}
|
544 |
+
.glyphicon-minus-sign:before {
|
545 |
+
content: "\e082";
|
546 |
+
}
|
547 |
+
.glyphicon-remove-sign:before {
|
548 |
+
content: "\e083";
|
549 |
+
}
|
550 |
+
.glyphicon-ok-sign:before {
|
551 |
+
content: "\e084";
|
552 |
+
}
|
553 |
+
.glyphicon-question-sign:before {
|
554 |
+
content: "\e085";
|
555 |
+
}
|
556 |
+
.glyphicon-info-sign:before {
|
557 |
+
content: "\e086";
|
558 |
+
}
|
559 |
+
.glyphicon-screenshot:before {
|
560 |
+
content: "\e087";
|
561 |
+
}
|
562 |
+
.glyphicon-remove-circle:before {
|
563 |
+
content: "\e088";
|
564 |
+
}
|
565 |
+
.glyphicon-ok-circle:before {
|
566 |
+
content: "\e089";
|
567 |
+
}
|
568 |
+
.glyphicon-ban-circle:before {
|
569 |
+
content: "\e090";
|
570 |
+
}
|
571 |
+
.glyphicon-arrow-left:before {
|
572 |
+
content: "\e091";
|
573 |
+
}
|
574 |
+
.glyphicon-arrow-right:before {
|
575 |
+
content: "\e092";
|
576 |
+
}
|
577 |
+
.glyphicon-arrow-up:before {
|
578 |
+
content: "\e093";
|
579 |
+
}
|
580 |
+
.glyphicon-arrow-down:before {
|
581 |
+
content: "\e094";
|
582 |
+
}
|
583 |
+
.glyphicon-share-alt:before {
|
584 |
+
content: "\e095";
|
585 |
+
}
|
586 |
+
.glyphicon-resize-full:before {
|
587 |
+
content: "\e096";
|
588 |
+
}
|
589 |
+
.glyphicon-resize-small:before {
|
590 |
+
content: "\e097";
|
591 |
+
}
|
592 |
+
.glyphicon-exclamation-sign:before {
|
593 |
+
content: "\e101";
|
594 |
+
}
|
595 |
+
.glyphicon-gift:before {
|
596 |
+
content: "\e102";
|
597 |
+
}
|
598 |
+
.glyphicon-leaf:before {
|
599 |
+
content: "\e103";
|
600 |
+
}
|
601 |
+
.glyphicon-fire:before {
|
602 |
+
content: "\e104";
|
603 |
+
}
|
604 |
+
.glyphicon-eye-open:before {
|
605 |
+
content: "\e105";
|
606 |
+
}
|
607 |
+
.glyphicon-eye-close:before {
|
608 |
+
content: "\e106";
|
609 |
+
}
|
610 |
+
.glyphicon-warning-sign:before {
|
611 |
+
content: "\e107";
|
612 |
+
}
|
613 |
+
.glyphicon-plane:before {
|
614 |
+
content: "\e108";
|
615 |
+
}
|
616 |
+
.glyphicon-calendar:before {
|
617 |
+
content: "\e109";
|
618 |
+
}
|
619 |
+
.glyphicon-random:before {
|
620 |
+
content: "\e110";
|
621 |
+
}
|
622 |
+
.glyphicon-comment:before {
|
623 |
+
content: "\e111";
|
624 |
+
}
|
625 |
+
.glyphicon-magnet:before {
|
626 |
+
content: "\e112";
|
627 |
+
}
|
628 |
+
.glyphicon-chevron-up:before {
|
629 |
+
content: "\e113";
|
630 |
+
}
|
631 |
+
.glyphicon-chevron-down:before {
|
632 |
+
content: "\e114";
|
633 |
+
}
|
634 |
+
.glyphicon-retweet:before {
|
635 |
+
content: "\e115";
|
636 |
+
}
|
637 |
+
.glyphicon-shopping-cart:before {
|
638 |
+
content: "\e116";
|
639 |
+
}
|
640 |
+
.glyphicon-folder-close:before {
|
641 |
+
content: "\e117";
|
642 |
+
}
|
643 |
+
.glyphicon-folder-open:before {
|
644 |
+
content: "\e118";
|
645 |
+
}
|
646 |
+
.glyphicon-resize-vertical:before {
|
647 |
+
content: "\e119";
|
648 |
+
}
|
649 |
+
.glyphicon-resize-horizontal:before {
|
650 |
+
content: "\e120";
|
651 |
+
}
|
652 |
+
.glyphicon-hdd:before {
|
653 |
+
content: "\e121";
|
654 |
+
}
|
655 |
+
.glyphicon-bullhorn:before {
|
656 |
+
content: "\e122";
|
657 |
+
}
|
658 |
+
.glyphicon-bell:before {
|
659 |
+
content: "\e123";
|
660 |
+
}
|
661 |
+
.glyphicon-certificate:before {
|
662 |
+
content: "\e124";
|
663 |
+
}
|
664 |
+
.glyphicon-thumbs-up:before {
|
665 |
+
content: "\e125";
|
666 |
+
}
|
667 |
+
.glyphicon-thumbs-down:before {
|
668 |
+
content: "\e126";
|
669 |
+
}
|
670 |
+
.glyphicon-hand-right:before {
|
671 |
+
content: "\e127";
|
672 |
+
}
|
673 |
+
.glyphicon-hand-left:before {
|
674 |
+
content: "\e128";
|
675 |
+
}
|
676 |
+
.glyphicon-hand-up:before {
|
677 |
+
content: "\e129";
|
678 |
+
}
|
679 |
+
.glyphicon-hand-down:before {
|
680 |
+
content: "\e130";
|
681 |
+
}
|
682 |
+
.glyphicon-circle-arrow-right:before {
|
683 |
+
content: "\e131";
|
684 |
+
}
|
685 |
+
.glyphicon-circle-arrow-left:before {
|
686 |
+
content: "\e132";
|
687 |
+
}
|
688 |
+
.glyphicon-circle-arrow-up:before {
|
689 |
+
content: "\e133";
|
690 |
+
}
|
691 |
+
.glyphicon-circle-arrow-down:before {
|
692 |
+
content: "\e134";
|
693 |
+
}
|
694 |
+
.glyphicon-globe:before {
|
695 |
+
content: "\e135";
|
696 |
+
}
|
697 |
+
.glyphicon-wrench:before {
|
698 |
+
content: "\e136";
|
699 |
+
}
|
700 |
+
.glyphicon-tasks:before {
|
701 |
+
content: "\e137";
|
702 |
+
}
|
703 |
+
.glyphicon-filter:before {
|
704 |
+
content: "\e138";
|
705 |
+
}
|
706 |
+
.glyphicon-briefcase:before {
|
707 |
+
content: "\e139";
|
708 |
+
}
|
709 |
+
.glyphicon-fullscreen:before {
|
710 |
+
content: "\e140";
|
711 |
+
}
|
712 |
+
.glyphicon-dashboard:before {
|
713 |
+
content: "\e141";
|
714 |
+
}
|
715 |
+
.glyphicon-paperclip:before {
|
716 |
+
content: "\e142";
|
717 |
+
}
|
718 |
+
.glyphicon-heart-empty:before {
|
719 |
+
content: "\e143";
|
720 |
+
}
|
721 |
+
.glyphicon-link:before {
|
722 |
+
content: "\e144";
|
723 |
+
}
|
724 |
+
.glyphicon-phone:before {
|
725 |
+
content: "\e145";
|
726 |
+
}
|
727 |
+
.glyphicon-pushpin:before {
|
728 |
+
content: "\e146";
|
729 |
+
}
|
730 |
+
.glyphicon-usd:before {
|
731 |
+
content: "\e148";
|
732 |
+
}
|
733 |
+
.glyphicon-gbp:before {
|
734 |
+
content: "\e149";
|
735 |
+
}
|
736 |
+
.glyphicon-sort:before {
|
737 |
+
content: "\e150";
|
738 |
+
}
|
739 |
+
.glyphicon-sort-by-alphabet:before {
|
740 |
+
content: "\e151";
|
741 |
+
}
|
742 |
+
.glyphicon-sort-by-alphabet-alt:before {
|
743 |
+
content: "\e152";
|
744 |
+
}
|
745 |
+
.glyphicon-sort-by-order:before {
|
746 |
+
content: "\e153";
|
747 |
+
}
|
748 |
+
.glyphicon-sort-by-order-alt:before {
|
749 |
+
content: "\e154";
|
750 |
+
}
|
751 |
+
.glyphicon-sort-by-attributes:before {
|
752 |
+
content: "\e155";
|
753 |
+
}
|
754 |
+
.glyphicon-sort-by-attributes-alt:before {
|
755 |
+
content: "\e156";
|
756 |
+
}
|
757 |
+
.glyphicon-unchecked:before {
|
758 |
+
content: "\e157";
|
759 |
+
}
|
760 |
+
.glyphicon-expand:before {
|
761 |
+
content: "\e158";
|
762 |
+
}
|
763 |
+
.glyphicon-collapse-down:before {
|
764 |
+
content: "\e159";
|
765 |
+
}
|
766 |
+
.glyphicon-collapse-up:before {
|
767 |
+
content: "\e160";
|
768 |
+
}
|
769 |
+
.glyphicon-log-in:before {
|
770 |
+
content: "\e161";
|
771 |
+
}
|
772 |
+
.glyphicon-flash:before {
|
773 |
+
content: "\e162";
|
774 |
+
}
|
775 |
+
.glyphicon-log-out:before {
|
776 |
+
content: "\e163";
|
777 |
+
}
|
778 |
+
.glyphicon-new-window:before {
|
779 |
+
content: "\e164";
|
780 |
+
}
|
781 |
+
.glyphicon-record:before {
|
782 |
+
content: "\e165";
|
783 |
+
}
|
784 |
+
.glyphicon-save:before {
|
785 |
+
content: "\e166";
|
786 |
+
}
|
787 |
+
.glyphicon-open:before {
|
788 |
+
content: "\e167";
|
789 |
+
}
|
790 |
+
.glyphicon-saved:before {
|
791 |
+
content: "\e168";
|
792 |
+
}
|
793 |
+
.glyphicon-import:before {
|
794 |
+
content: "\e169";
|
795 |
+
}
|
796 |
+
.glyphicon-export:before {
|
797 |
+
content: "\e170";
|
798 |
+
}
|
799 |
+
.glyphicon-send:before {
|
800 |
+
content: "\e171";
|
801 |
+
}
|
802 |
+
.glyphicon-floppy-disk:before {
|
803 |
+
content: "\e172";
|
804 |
+
}
|
805 |
+
.glyphicon-floppy-saved:before {
|
806 |
+
content: "\e173";
|
807 |
+
}
|
808 |
+
.glyphicon-floppy-remove:before {
|
809 |
+
content: "\e174";
|
810 |
+
}
|
811 |
+
.glyphicon-floppy-save:before {
|
812 |
+
content: "\e175";
|
813 |
+
}
|
814 |
+
.glyphicon-floppy-open:before {
|
815 |
+
content: "\e176";
|
816 |
+
}
|
817 |
+
.glyphicon-credit-card:before {
|
818 |
+
content: "\e177";
|
819 |
+
}
|
820 |
+
.glyphicon-transfer:before {
|
821 |
+
content: "\e178";
|
822 |
+
}
|
823 |
+
.glyphicon-cutlery:before {
|
824 |
+
content: "\e179";
|
825 |
+
}
|
826 |
+
.glyphicon-header:before {
|
827 |
+
content: "\e180";
|
828 |
+
}
|
829 |
+
.glyphicon-compressed:before {
|
830 |
+
content: "\e181";
|
831 |
+
}
|
832 |
+
.glyphicon-earphone:before {
|
833 |
+
content: "\e182";
|
834 |
+
}
|
835 |
+
.glyphicon-phone-alt:before {
|
836 |
+
content: "\e183";
|
837 |
+
}
|
838 |
+
.glyphicon-tower:before {
|
839 |
+
content: "\e184";
|
840 |
+
}
|
841 |
+
.glyphicon-stats:before {
|
842 |
+
content: "\e185";
|
843 |
+
}
|
844 |
+
.glyphicon-sd-video:before {
|
845 |
+
content: "\e186";
|
846 |
+
}
|
847 |
+
.glyphicon-hd-video:before {
|
848 |
+
content: "\e187";
|
849 |
+
}
|
850 |
+
.glyphicon-subtitles:before {
|
851 |
+
content: "\e188";
|
852 |
+
}
|
853 |
+
.glyphicon-sound-stereo:before {
|
854 |
+
content: "\e189";
|
855 |
+
}
|
856 |
+
.glyphicon-sound-dolby:before {
|
857 |
+
content: "\e190";
|
858 |
+
}
|
859 |
+
.glyphicon-sound-5-1:before {
|
860 |
+
content: "\e191";
|
861 |
+
}
|
862 |
+
.glyphicon-sound-6-1:before {
|
863 |
+
content: "\e192";
|
864 |
+
}
|
865 |
+
.glyphicon-sound-7-1:before {
|
866 |
+
content: "\e193";
|
867 |
+
}
|
868 |
+
.glyphicon-copyright-mark:before {
|
869 |
+
content: "\e194";
|
870 |
+
}
|
871 |
+
.glyphicon-registration-mark:before {
|
872 |
+
content: "\e195";
|
873 |
+
}
|
874 |
+
.glyphicon-cloud-download:before {
|
875 |
+
content: "\e197";
|
876 |
+
}
|
877 |
+
.glyphicon-cloud-upload:before {
|
878 |
+
content: "\e198";
|
879 |
+
}
|
880 |
+
.glyphicon-tree-conifer:before {
|
881 |
+
content: "\e199";
|
882 |
+
}
|
883 |
+
.glyphicon-tree-deciduous:before {
|
884 |
+
content: "\e200";
|
885 |
+
}
|
886 |
+
* {
|
887 |
+
-webkit-box-sizing: border-box;
|
888 |
+
-moz-box-sizing: border-box;
|
889 |
+
box-sizing: border-box;
|
890 |
+
}
|
891 |
+
*:before,
|
892 |
+
*:after {
|
893 |
+
-webkit-box-sizing: border-box;
|
894 |
+
-moz-box-sizing: border-box;
|
895 |
+
box-sizing: border-box;
|
896 |
+
}
|
897 |
+
html {
|
898 |
+
font-size: 10px;
|
899 |
+
|
900 |
+
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
|
901 |
+
}
|
902 |
+
body {
|
903 |
+
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
904 |
+
font-size: 14px;
|
905 |
+
line-height: 1.42857143;
|
906 |
+
color: #333;
|
907 |
+
background-color: #fff;
|
908 |
+
}
|
909 |
+
input,
|
910 |
+
button,
|
911 |
+
select,
|
912 |
+
textarea {
|
913 |
+
font-family: inherit;
|
914 |
+
font-size: inherit;
|
915 |
+
line-height: inherit;
|
916 |
+
}
|
917 |
+
a {
|
918 |
+
color: #428bca;
|
919 |
+
text-decoration: none;
|
920 |
+
}
|
921 |
+
a:hover,
|
922 |
+
a:focus {
|
923 |
+
color: #2a6496;
|
924 |
+
text-decoration: underline;
|
925 |
+
}
|
926 |
+
a:focus {
|
927 |
+
outline: thin dotted;
|
928 |
+
outline: 5px auto -webkit-focus-ring-color;
|
929 |
+
outline-offset: -2px;
|
930 |
+
}
|
931 |
+
figure {
|
932 |
+
margin: 0;
|
933 |
+
}
|
934 |
+
img {
|
935 |
+
vertical-align: middle;
|
936 |
+
}
|
937 |
+
.img-responsive,
|
938 |
+
.thumbnail > img,
|
939 |
+
.thumbnail a > img,
|
940 |
+
.carousel-inner > .item > img,
|
941 |
+
.carousel-inner > .item > a > img {
|
942 |
+
display: block;
|
943 |
+
max-width: 100%;
|
944 |
+
height: auto;
|
945 |
+
}
|
946 |
+
.img-rounded {
|
947 |
+
border-radius: 6px;
|
948 |
+
}
|
949 |
+
.img-thumbnail {
|
950 |
+
display: inline-block;
|
951 |
+
max-width: 100%;
|
952 |
+
height: auto;
|
953 |
+
padding: 4px;
|
954 |
+
line-height: 1.42857143;
|
955 |
+
background-color: #fff;
|
956 |
+
border: 1px solid #ddd;
|
957 |
+
border-radius: 4px;
|
958 |
+
-webkit-transition: all .2s ease-in-out;
|
959 |
+
-o-transition: all .2s ease-in-out;
|
960 |
+
transition: all .2s ease-in-out;
|
961 |
+
}
|
962 |
+
.img-circle {
|
963 |
+
border-radius: 50%;
|
964 |
+
}
|
965 |
+
hr {
|
966 |
+
margin-top: 20px;
|
967 |
+
margin-bottom: 20px;
|
968 |
+
border: 0;
|
969 |
+
border-top: 1px solid #eee;
|
970 |
+
}
|
971 |
+
.sr-only {
|
972 |
+
position: absolute;
|
973 |
+
width: 1px;
|
974 |
+
height: 1px;
|
975 |
+
padding: 0;
|
976 |
+
margin: -1px;
|
977 |
+
overflow: hidden;
|
978 |
+
clip: rect(0, 0, 0, 0);
|
979 |
+
border: 0;
|
980 |
+
}
|
981 |
+
.sr-only-focusable:active,
|
982 |
+
.sr-only-focusable:focus {
|
983 |
+
position: static;
|
984 |
+
width: auto;
|
985 |
+
height: auto;
|
986 |
+
margin: 0;
|
987 |
+
overflow: visible;
|
988 |
+
clip: auto;
|
989 |
+
}
|
990 |
+
h1,
|
991 |
+
h2,
|
992 |
+
h3,
|
993 |
+
h4,
|
994 |
+
h5,
|
995 |
+
h6,
|
996 |
+
.h1,
|
997 |
+
.h2,
|
998 |
+
.h3,
|
999 |
+
.h4,
|
1000 |
+
.h5,
|
1001 |
+
.h6 {
|
1002 |
+
font-family: inherit;
|
1003 |
+
font-weight: 500;
|
1004 |
+
line-height: 1.1;
|
1005 |
+
color: inherit;
|
1006 |
+
}
|
1007 |
+
h1 small,
|
1008 |
+
h2 small,
|
1009 |
+
h3 small,
|
1010 |
+
h4 small,
|
1011 |
+
h5 small,
|
1012 |
+
h6 small,
|
1013 |
+
.h1 small,
|
1014 |
+
.h2 small,
|
1015 |
+
.h3 small,
|
1016 |
+
.h4 small,
|
1017 |
+
.h5 small,
|
1018 |
+
.h6 small,
|
1019 |
+
h1 .small,
|
1020 |
+
h2 .small,
|
1021 |
+
h3 .small,
|
1022 |
+
h4 .small,
|
1023 |
+
h5 .small,
|
1024 |
+
h6 .small,
|
1025 |
+
.h1 .small,
|
1026 |
+
.h2 .small,
|
1027 |
+
.h3 .small,
|
1028 |
+
.h4 .small,
|
1029 |
+
.h5 .small,
|
1030 |
+
.h6 .small {
|
1031 |
+
font-weight: normal;
|
1032 |
+
line-height: 1;
|
1033 |
+
color: #777;
|
1034 |
+
}
|
1035 |
+
h1,
|
1036 |
+
.h1,
|
1037 |
+
h2,
|
1038 |
+
.h2,
|
1039 |
+
h3,
|
1040 |
+
.h3 {
|
1041 |
+
margin-top: 20px;
|
1042 |
+
margin-bottom: 10px;
|
1043 |
+
}
|
1044 |
+
h1 small,
|
1045 |
+
.h1 small,
|
1046 |
+
h2 small,
|
1047 |
+
.h2 small,
|
1048 |
+
h3 small,
|
1049 |
+
.h3 small,
|
1050 |
+
h1 .small,
|
1051 |
+
.h1 .small,
|
1052 |
+
h2 .small,
|
1053 |
+
.h2 .small,
|
1054 |
+
h3 .small,
|
1055 |
+
.h3 .small {
|
1056 |
+
font-size: 65%;
|
1057 |
+
}
|
1058 |
+
h4,
|
1059 |
+
.h4,
|
1060 |
+
h5,
|
1061 |
+
.h5,
|
1062 |
+
h6,
|
1063 |
+
.h6 {
|
1064 |
+
margin-top: 10px;
|
1065 |
+
margin-bottom: 10px;
|
1066 |
+
}
|
1067 |
+
h4 small,
|
1068 |
+
.h4 small,
|
1069 |
+
h5 small,
|
1070 |
+
.h5 small,
|
1071 |
+
h6 small,
|
1072 |
+
.h6 small,
|
1073 |
+
h4 .small,
|
1074 |
+
.h4 .small,
|
1075 |
+
h5 .small,
|
1076 |
+
.h5 .small,
|
1077 |
+
h6 .small,
|
1078 |
+
.h6 .small {
|
1079 |
+
font-size: 75%;
|
1080 |
+
}
|
1081 |
+
h1,
|
1082 |
+
.h1 {
|
1083 |
+
font-size: 36px;
|
1084 |
+
}
|
1085 |
+
h2,
|
1086 |
+
.h2 {
|
1087 |
+
font-size: 30px;
|
1088 |
+
}
|
1089 |
+
h3,
|
1090 |
+
.h3 {
|
1091 |
+
font-size: 24px;
|
1092 |
+
}
|
1093 |
+
h4,
|
1094 |
+
.h4 {
|
1095 |
+
font-size: 18px;
|
1096 |
+
}
|
1097 |
+
h5,
|
1098 |
+
.h5 {
|
1099 |
+
font-size: 14px;
|
1100 |
+
}
|
1101 |
+
h6,
|
1102 |
+
.h6 {
|
1103 |
+
font-size: 12px;
|
1104 |
+
}
|
1105 |
+
p {
|
1106 |
+
margin: 0 0 10px;
|
1107 |
+
}
|
1108 |
+
.lead {
|
1109 |
+
margin-bottom: 20px;
|
1110 |
+
font-size: 16px;
|
1111 |
+
font-weight: 300;
|
1112 |
+
line-height: 1.4;
|
1113 |
+
}
|
1114 |
+
@media (min-width: 768px) {
|
1115 |
+
.lead {
|
1116 |
+
font-size: 21px;
|
1117 |
+
}
|
1118 |
+
}
|
1119 |
+
small,
|
1120 |
+
.small {
|
1121 |
+
font-size: 85%;
|
1122 |
+
}
|
1123 |
+
mark,
|
1124 |
+
.mark {
|
1125 |
+
padding: .2em;
|
1126 |
+
background-color: #fcf8e3;
|
1127 |
+
}
|
1128 |
+
.text-left {
|
1129 |
+
text-align: left;
|
1130 |
+
}
|
1131 |
+
.text-right {
|
1132 |
+
text-align: right;
|
1133 |
+
}
|
1134 |
+
.text-center {
|
1135 |
+
text-align: center;
|
1136 |
+
}
|
1137 |
+
.text-justify {
|
1138 |
+
text-align: justify;
|
1139 |
+
}
|
1140 |
+
.text-nowrap {
|
1141 |
+
white-space: nowrap;
|
1142 |
+
}
|
1143 |
+
.text-lowercase {
|
1144 |
+
text-transform: lowercase;
|
1145 |
+
}
|
1146 |
+
.text-uppercase {
|
1147 |
+
text-transform: uppercase;
|
1148 |
+
}
|
1149 |
+
.text-capitalize {
|
1150 |
+
text-transform: capitalize;
|
1151 |
+
}
|
1152 |
+
.text-muted {
|
1153 |
+
color: #777;
|
1154 |
+
}
|
1155 |
+
.text-primary {
|
1156 |
+
color: #428bca;
|
1157 |
+
}
|
1158 |
+
a.text-primary:hover {
|
1159 |
+
color: #3071a9;
|
1160 |
+
}
|
1161 |
+
.text-success {
|
1162 |
+
color: #3c763d;
|
1163 |
+
}
|
1164 |
+
a.text-success:hover {
|
1165 |
+
color: #2b542c;
|
1166 |
+
}
|
1167 |
+
.text-info {
|
1168 |
+
color: #31708f;
|
1169 |
+
}
|
1170 |
+
a.text-info:hover {
|
1171 |
+
color: #245269;
|
1172 |
+
}
|
1173 |
+
.text-warning {
|
1174 |
+
color: #8a6d3b;
|
1175 |
+
}
|
1176 |
+
a.text-warning:hover {
|
1177 |
+
color: #66512c;
|
1178 |
+
}
|
1179 |
+
.text-danger {
|
1180 |
+
color: #a94442;
|
1181 |
+
}
|
1182 |
+
a.text-danger:hover {
|
1183 |
+
color: #843534;
|
1184 |
+
}
|
1185 |
+
.bg-primary {
|
1186 |
+
color: #fff;
|
1187 |
+
background-color: #428bca;
|
1188 |
+
}
|
1189 |
+
a.bg-primary:hover {
|
1190 |
+
background-color: #3071a9;
|
1191 |
+
}
|
1192 |
+
.bg-success {
|
1193 |
+
background-color: #dff0d8;
|
1194 |
+
}
|
1195 |
+
a.bg-success:hover {
|
1196 |
+
background-color: #c1e2b3;
|
1197 |
+
}
|
1198 |
+
.bg-info {
|
1199 |
+
background-color: #d9edf7;
|
1200 |
+
}
|
1201 |
+
a.bg-info:hover {
|
1202 |
+
background-color: #afd9ee;
|
1203 |
+
}
|
1204 |
+
.bg-warning {
|
1205 |
+
background-color: #fcf8e3;
|
1206 |
+
}
|
1207 |
+
a.bg-warning:hover {
|
1208 |
+
background-color: #f7ecb5;
|
1209 |
+
}
|
1210 |
+
.bg-danger {
|
1211 |
+
background-color: #f2dede;
|
1212 |
+
}
|
1213 |
+
a.bg-danger:hover {
|
1214 |
+
background-color: #e4b9b9;
|
1215 |
+
}
|
1216 |
+
.page-header {
|
1217 |
+
padding-bottom: 9px;
|
1218 |
+
margin: 40px 0 20px;
|
1219 |
+
border-bottom: 1px solid #eee;
|
1220 |
+
}
|
1221 |
+
ul,
|
1222 |
+
ol {
|
1223 |
+
margin-top: 0;
|
1224 |
+
margin-bottom: 10px;
|
1225 |
+
}
|
1226 |
+
ul ul,
|
1227 |
+
ol ul,
|
1228 |
+
ul ol,
|
1229 |
+
ol ol {
|
1230 |
+
margin-bottom: 0;
|
1231 |
+
}
|
1232 |
+
.list-unstyled {
|
1233 |
+
padding-left: 0;
|
1234 |
+
list-style: none;
|
1235 |
+
}
|
1236 |
+
.list-inline {
|
1237 |
+
padding-left: 0;
|
1238 |
+
margin-left: -5px;
|
1239 |
+
list-style: none;
|
1240 |
+
}
|
1241 |
+
.list-inline > li {
|
1242 |
+
display: inline-block;
|
1243 |
+
padding-right: 5px;
|
1244 |
+
padding-left: 5px;
|
1245 |
+
}
|
1246 |
+
dl {
|
1247 |
+
margin-top: 0;
|
1248 |
+
margin-bottom: 20px;
|
1249 |
+
}
|
1250 |
+
dt,
|
1251 |
+
dd {
|
1252 |
+
line-height: 1.42857143;
|
1253 |
+
}
|
1254 |
+
dt {
|
1255 |
+
font-weight: bold;
|
1256 |
+
}
|
1257 |
+
dd {
|
1258 |
+
margin-left: 0;
|
1259 |
+
}
|
1260 |
+
@media (min-width: 768px) {
|
1261 |
+
.dl-horizontal dt {
|
1262 |
+
float: left;
|
1263 |
+
width: 160px;
|
1264 |
+
overflow: hidden;
|
1265 |
+
clear: left;
|
1266 |
+
text-align: right;
|
1267 |
+
text-overflow: ellipsis;
|
1268 |
+
white-space: nowrap;
|
1269 |
+
}
|
1270 |
+
.dl-horizontal dd {
|
1271 |
+
margin-left: 180px;
|
1272 |
+
}
|
1273 |
+
}
|
1274 |
+
abbr[title],
|
1275 |
+
abbr[data-original-title] {
|
1276 |
+
cursor: help;
|
1277 |
+
border-bottom: 1px dotted #777;
|
1278 |
+
}
|
1279 |
+
.initialism {
|
1280 |
+
font-size: 90%;
|
1281 |
+
text-transform: uppercase;
|
1282 |
+
}
|
1283 |
+
blockquote {
|
1284 |
+
padding: 10px 20px;
|
1285 |
+
margin: 0 0 20px;
|
1286 |
+
font-size: 17.5px;
|
1287 |
+
border-left: 5px solid #eee;
|
1288 |
+
}
|
1289 |
+
blockquote p:last-child,
|
1290 |
+
blockquote ul:last-child,
|
1291 |
+
blockquote ol:last-child {
|
1292 |
+
margin-bottom: 0;
|
1293 |
+
}
|
1294 |
+
blockquote footer,
|
1295 |
+
blockquote small,
|
1296 |
+
blockquote .small {
|
1297 |
+
display: block;
|
1298 |
+
font-size: 80%;
|
1299 |
+
line-height: 1.42857143;
|
1300 |
+
color: #777;
|
1301 |
+
}
|
1302 |
+
blockquote footer:before,
|
1303 |
+
blockquote small:before,
|
1304 |
+
blockquote .small:before {
|
1305 |
+
content: '\2014 \00A0';
|
1306 |
+
}
|
1307 |
+
.blockquote-reverse,
|
1308 |
+
blockquote.pull-right {
|
1309 |
+
padding-right: 15px;
|
1310 |
+
padding-left: 0;
|
1311 |
+
text-align: right;
|
1312 |
+
border-right: 5px solid #eee;
|
1313 |
+
border-left: 0;
|
1314 |
+
}
|
1315 |
+
.blockquote-reverse footer:before,
|
1316 |
+
blockquote.pull-right footer:before,
|
1317 |
+
.blockquote-reverse small:before,
|
1318 |
+
blockquote.pull-right small:before,
|
1319 |
+
.blockquote-reverse .small:before,
|
1320 |
+
blockquote.pull-right .small:before {
|
1321 |
+
content: '';
|
1322 |
+
}
|
1323 |
+
.blockquote-reverse footer:after,
|
1324 |
+
blockquote.pull-right footer:after,
|
1325 |
+
.blockquote-reverse small:after,
|
1326 |
+
blockquote.pull-right small:after,
|
1327 |
+
.blockquote-reverse .small:after,
|
1328 |
+
blockquote.pull-right .small:after {
|
1329 |
+
content: '\00A0 \2014';
|
1330 |
+
}
|
1331 |
+
address {
|
1332 |
+
margin-bottom: 20px;
|
1333 |
+
font-style: normal;
|
1334 |
+
line-height: 1.42857143;
|
1335 |
+
}
|
1336 |
+
code,
|
1337 |
+
kbd,
|
1338 |
+
pre,
|
1339 |
+
samp {
|
1340 |
+
font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
|
1341 |
+
}
|
1342 |
+
code {
|
1343 |
+
padding: 2px 4px;
|
1344 |
+
font-size: 90%;
|
1345 |
+
color: #c7254e;
|
1346 |
+
background-color: #f9f2f4;
|
1347 |
+
border-radius: 4px;
|
1348 |
+
}
|
1349 |
+
kbd {
|
1350 |
+
padding: 2px 4px;
|
1351 |
+
font-size: 90%;
|
1352 |
+
color: #fff;
|
1353 |
+
background-color: #333;
|
1354 |
+
border-radius: 3px;
|
1355 |
+
-webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);
|
1356 |
+
box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);
|
1357 |
+
}
|
1358 |
+
kbd kbd {
|
1359 |
+
padding: 0;
|
1360 |
+
font-size: 100%;
|
1361 |
+
font-weight: bold;
|
1362 |
+
-webkit-box-shadow: none;
|
1363 |
+
box-shadow: none;
|
1364 |
+
}
|
1365 |
+
pre {
|
1366 |
+
display: block;
|
1367 |
+
padding: 9.5px;
|
1368 |
+
margin: 0 0 10px;
|
1369 |
+
font-size: 13px;
|
1370 |
+
line-height: 1.42857143;
|
1371 |
+
color: #333;
|
1372 |
+
word-break: break-all;
|
1373 |
+
word-wrap: break-word;
|
1374 |
+
background-color: #f5f5f5;
|
1375 |
+
border: 1px solid #ccc;
|
1376 |
+
border-radius: 4px;
|
1377 |
+
}
|
1378 |
+
pre code {
|
1379 |
+
padding: 0;
|
1380 |
+
font-size: inherit;
|
1381 |
+
color: inherit;
|
1382 |
+
white-space: pre-wrap;
|
1383 |
+
background-color: transparent;
|
1384 |
+
border-radius: 0;
|
1385 |
+
}
|
1386 |
+
.pre-scrollable {
|
1387 |
+
max-height: 340px;
|
1388 |
+
overflow-y: scroll;
|
1389 |
+
}
|
1390 |
+
.container {
|
1391 |
+
padding-right: 15px;
|
1392 |
+
padding-left: 15px;
|
1393 |
+
margin-right: auto;
|
1394 |
+
margin-left: auto;
|
1395 |
+
}
|
1396 |
+
@media (min-width: 768px) {
|
1397 |
+
.container {
|
1398 |
+
width: 750px;
|
1399 |
+
}
|
1400 |
+
}
|
1401 |
+
@media (min-width: 992px) {
|
1402 |
+
.container {
|
1403 |
+
width: 970px;
|
1404 |
+
}
|
1405 |
+
}
|
1406 |
+
@media (min-width: 1200px) {
|
1407 |
+
.container {
|
1408 |
+
width: 1170px;
|
1409 |
+
}
|
1410 |
+
}
|
1411 |
+
.container-fluid {
|
1412 |
+
padding-right: 15px;
|
1413 |
+
padding-left: 15px;
|
1414 |
+
margin-right: auto;
|
1415 |
+
margin-left: auto;
|
1416 |
+
}
|
1417 |
+
.row {
|
1418 |
+
margin-right: -15px;
|
1419 |
+
margin-left: -15px;
|
1420 |
+
}
|
1421 |
+
.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {
|
1422 |
+
position: relative;
|
1423 |
+
min-height: 1px;
|
1424 |
+
padding-right: 15px;
|
1425 |
+
padding-left: 15px;
|
1426 |
+
}
|
1427 |
+
.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {
|
1428 |
+
float: left;
|
1429 |
+
}
|
1430 |
+
.col-xs-12 {
|
1431 |
+
width: 100%;
|
1432 |
+
}
|
1433 |
+
.col-xs-11 {
|
1434 |
+
width: 91.66666667%;
|
1435 |
+
}
|
1436 |
+
.col-xs-10 {
|
1437 |
+
width: 83.33333333%;
|
1438 |
+
}
|
1439 |
+
.col-xs-9 {
|
1440 |
+
width: 75%;
|
1441 |
+
}
|
1442 |
+
.col-xs-8 {
|
1443 |
+
width: 66.66666667%;
|
1444 |
+
}
|
1445 |
+
.col-xs-7 {
|
1446 |
+
width: 58.33333333%;
|
1447 |
+
}
|
1448 |
+
.col-xs-6 {
|
1449 |
+
width: 50%;
|
1450 |
+
}
|
1451 |
+
.col-xs-5 {
|
1452 |
+
width: 41.66666667%;
|
1453 |
+
}
|
1454 |
+
.col-xs-4 {
|
1455 |
+
width: 33.33333333%;
|
1456 |
+
}
|
1457 |
+
.col-xs-3 {
|
1458 |
+
width: 25%;
|
1459 |
+
}
|
1460 |
+
.col-xs-2 {
|
1461 |
+
width: 16.66666667%;
|
1462 |
+
}
|
1463 |
+
.col-xs-1 {
|
1464 |
+
width: 8.33333333%;
|
1465 |
+
}
|
1466 |
+
.col-xs-pull-12 {
|
1467 |
+
right: 100%;
|
1468 |
+
}
|
1469 |
+
.col-xs-pull-11 {
|
1470 |
+
right: 91.66666667%;
|
1471 |
+
}
|
1472 |
+
.col-xs-pull-10 {
|
1473 |
+
right: 83.33333333%;
|
1474 |
+
}
|
1475 |
+
.col-xs-pull-9 {
|
1476 |
+
right: 75%;
|
1477 |
+
}
|
1478 |
+
.col-xs-pull-8 {
|
1479 |
+
right: 66.66666667%;
|
1480 |
+
}
|
1481 |
+
.col-xs-pull-7 {
|
1482 |
+
right: 58.33333333%;
|
1483 |
+
}
|
1484 |
+
.col-xs-pull-6 {
|
1485 |
+
right: 50%;
|
1486 |
+
}
|
1487 |
+
.col-xs-pull-5 {
|
1488 |
+
right: 41.66666667%;
|
1489 |
+
}
|
1490 |
+
.col-xs-pull-4 {
|
1491 |
+
right: 33.33333333%;
|
1492 |
+
}
|
1493 |
+
.col-xs-pull-3 {
|
1494 |
+
right: 25%;
|
1495 |
+
}
|
1496 |
+
.col-xs-pull-2 {
|
1497 |
+
right: 16.66666667%;
|
1498 |
+
}
|
1499 |
+
.col-xs-pull-1 {
|
1500 |
+
right: 8.33333333%;
|
1501 |
+
}
|
1502 |
+
.col-xs-pull-0 {
|
1503 |
+
right: auto;
|
1504 |
+
}
|
1505 |
+
.col-xs-push-12 {
|
1506 |
+
left: 100%;
|
1507 |
+
}
|
1508 |
+
.col-xs-push-11 {
|
1509 |
+
left: 91.66666667%;
|
1510 |
+
}
|
1511 |
+
.col-xs-push-10 {
|
1512 |
+
left: 83.33333333%;
|
1513 |
+
}
|
1514 |
+
.col-xs-push-9 {
|
1515 |
+
left: 75%;
|
1516 |
+
}
|
1517 |
+
.col-xs-push-8 {
|
1518 |
+
left: 66.66666667%;
|
1519 |
+
}
|
1520 |
+
.col-xs-push-7 {
|
1521 |
+
left: 58.33333333%;
|
1522 |
+
}
|
1523 |
+
.col-xs-push-6 {
|
1524 |
+
left: 50%;
|
1525 |
+
}
|
1526 |
+
.col-xs-push-5 {
|
1527 |
+
left: 41.66666667%;
|
1528 |
+
}
|
1529 |
+
.col-xs-push-4 {
|
1530 |
+
left: 33.33333333%;
|
1531 |
+
}
|
1532 |
+
.col-xs-push-3 {
|
1533 |
+
left: 25%;
|
1534 |
+
}
|
1535 |
+
.col-xs-push-2 {
|
1536 |
+
left: 16.66666667%;
|
1537 |
+
}
|
1538 |
+
.col-xs-push-1 {
|
1539 |
+
left: 8.33333333%;
|
1540 |
+
}
|
1541 |
+
.col-xs-push-0 {
|
1542 |
+
left: auto;
|
1543 |
+
}
|
1544 |
+
.col-xs-offset-12 {
|
1545 |
+
margin-left: 100%;
|
1546 |
+
}
|
1547 |
+
.col-xs-offset-11 {
|
1548 |
+
margin-left: 91.66666667%;
|
1549 |
+
}
|
1550 |
+
.col-xs-offset-10 {
|
1551 |
+
margin-left: 83.33333333%;
|
1552 |
+
}
|
1553 |
+
.col-xs-offset-9 {
|
1554 |
+
margin-left: 75%;
|
1555 |
+
}
|
1556 |
+
.col-xs-offset-8 {
|
1557 |
+
margin-left: 66.66666667%;
|
1558 |
+
}
|
1559 |
+
.col-xs-offset-7 {
|
1560 |
+
margin-left: 58.33333333%;
|
1561 |
+
}
|
1562 |
+
.col-xs-offset-6 {
|
1563 |
+
margin-left: 50%;
|
1564 |
+
}
|
1565 |
+
.col-xs-offset-5 {
|
1566 |
+
margin-left: 41.66666667%;
|
1567 |
+
}
|
1568 |
+
.col-xs-offset-4 {
|
1569 |
+
margin-left: 33.33333333%;
|
1570 |
+
}
|
1571 |
+
.col-xs-offset-3 {
|
1572 |
+
margin-left: 25%;
|
1573 |
+
}
|
1574 |
+
.col-xs-offset-2 {
|
1575 |
+
margin-left: 16.66666667%;
|
1576 |
+
}
|
1577 |
+
.col-xs-offset-1 {
|
1578 |
+
margin-left: 8.33333333%;
|
1579 |
+
}
|
1580 |
+
.col-xs-offset-0 {
|
1581 |
+
margin-left: 0;
|
1582 |
+
}
|
1583 |
+
@media (min-width: 768px) {
|
1584 |
+
.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {
|
1585 |
+
float: left;
|
1586 |
+
}
|
1587 |
+
.col-sm-12 {
|
1588 |
+
width: 100%;
|
1589 |
+
}
|
1590 |
+
.col-sm-11 {
|
1591 |
+
width: 91.66666667%;
|
1592 |
+
}
|
1593 |
+
.col-sm-10 {
|
1594 |
+
width: 83.33333333%;
|
1595 |
+
}
|
1596 |
+
.col-sm-9 {
|
1597 |
+
width: 75%;
|
1598 |
+
}
|
1599 |
+
.col-sm-8 {
|
1600 |
+
width: 66.66666667%;
|
1601 |
+
}
|
1602 |
+
.col-sm-7 {
|
1603 |
+
width: 58.33333333%;
|
1604 |
+
}
|
1605 |
+
.col-sm-6 {
|
1606 |
+
width: 50%;
|
1607 |
+
}
|
1608 |
+
.col-sm-5 {
|
1609 |
+
width: 41.66666667%;
|
1610 |
+
}
|
1611 |
+
.col-sm-4 {
|
1612 |
+
width: 33.33333333%;
|
1613 |
+
}
|
1614 |
+
.col-sm-3 {
|
1615 |
+
width: 25%;
|
1616 |
+
}
|
1617 |
+
.col-sm-2 {
|
1618 |
+
width: 16.66666667%;
|
1619 |
+
}
|
1620 |
+
.col-sm-1 {
|
1621 |
+
width: 8.33333333%;
|
1622 |
+
}
|
1623 |
+
.col-sm-pull-12 {
|
1624 |
+
right: 100%;
|
1625 |
+
}
|
1626 |
+
.col-sm-pull-11 {
|
1627 |
+
right: 91.66666667%;
|
1628 |
+
}
|
1629 |
+
.col-sm-pull-10 {
|
1630 |
+
right: 83.33333333%;
|
1631 |
+
}
|
1632 |
+
.col-sm-pull-9 {
|
1633 |
+
right: 75%;
|
1634 |
+
}
|
1635 |
+
.col-sm-pull-8 {
|
1636 |
+
right: 66.66666667%;
|
1637 |
+
}
|
1638 |
+
.col-sm-pull-7 {
|
1639 |
+
right: 58.33333333%;
|
1640 |
+
}
|
1641 |
+
.col-sm-pull-6 {
|
1642 |
+
right: 50%;
|
1643 |
+
}
|
1644 |
+
.col-sm-pull-5 {
|
1645 |
+
right: 41.66666667%;
|
1646 |
+
}
|
1647 |
+
.col-sm-pull-4 {
|
1648 |
+
right: 33.33333333%;
|
1649 |
+
}
|
1650 |
+
.col-sm-pull-3 {
|
1651 |
+
right: 25%;
|
1652 |
+
}
|
1653 |
+
.col-sm-pull-2 {
|
1654 |
+
right: 16.66666667%;
|
1655 |
+
}
|
1656 |
+
.col-sm-pull-1 {
|
1657 |
+
right: 8.33333333%;
|
1658 |
+
}
|
1659 |
+
.col-sm-pull-0 {
|
1660 |
+
right: auto;
|
1661 |
+
}
|
1662 |
+
.col-sm-push-12 {
|
1663 |
+
left: 100%;
|
1664 |
+
}
|
1665 |
+
.col-sm-push-11 {
|
1666 |
+
left: 91.66666667%;
|
1667 |
+
}
|
1668 |
+
.col-sm-push-10 {
|
1669 |
+
left: 83.33333333%;
|
1670 |
+
}
|
1671 |
+
.col-sm-push-9 {
|
1672 |
+
left: 75%;
|
1673 |
+
}
|
1674 |
+
.col-sm-push-8 {
|
1675 |
+
left: 66.66666667%;
|
1676 |
+
}
|
1677 |
+
.col-sm-push-7 {
|
1678 |
+
left: 58.33333333%;
|
1679 |
+
}
|
1680 |
+
.col-sm-push-6 {
|
1681 |
+
left: 50%;
|
1682 |
+
}
|
1683 |
+
.col-sm-push-5 {
|
1684 |
+
left: 41.66666667%;
|
1685 |
+
}
|
1686 |
+
.col-sm-push-4 {
|
1687 |
+
left: 33.33333333%;
|
1688 |
+
}
|
1689 |
+
.col-sm-push-3 {
|
1690 |
+
left: 25%;
|
1691 |
+
}
|
1692 |
+
.col-sm-push-2 {
|
1693 |
+
left: 16.66666667%;
|
1694 |
+
}
|
1695 |
+
.col-sm-push-1 {
|
1696 |
+
left: 8.33333333%;
|
1697 |
+
}
|
1698 |
+
.col-sm-push-0 {
|
1699 |
+
left: auto;
|
1700 |
+
}
|
1701 |
+
.col-sm-offset-12 {
|
1702 |
+
margin-left: 100%;
|
1703 |
+
}
|
1704 |
+
.col-sm-offset-11 {
|
1705 |
+
margin-left: 91.66666667%;
|
1706 |
+
}
|
1707 |
+
.col-sm-offset-10 {
|
1708 |
+
margin-left: 83.33333333%;
|
1709 |
+
}
|
1710 |
+
.col-sm-offset-9 {
|
1711 |
+
margin-left: 75%;
|
1712 |
+
}
|
1713 |
+
.col-sm-offset-8 {
|
1714 |
+
margin-left: 66.66666667%;
|
1715 |
+
}
|
1716 |
+
.col-sm-offset-7 {
|
1717 |
+
margin-left: 58.33333333%;
|
1718 |
+
}
|
1719 |
+
.col-sm-offset-6 {
|
1720 |
+
margin-left: 50%;
|
1721 |
+
}
|
1722 |
+
.col-sm-offset-5 {
|
1723 |
+
margin-left: 41.66666667%;
|
1724 |
+
}
|
1725 |
+
.col-sm-offset-4 {
|
1726 |
+
margin-left: 33.33333333%;
|
1727 |
+
}
|
1728 |
+
.col-sm-offset-3 {
|
1729 |
+
margin-left: 25%;
|
1730 |
+
}
|
1731 |
+
.col-sm-offset-2 {
|
1732 |
+
margin-left: 16.66666667%;
|
1733 |
+
}
|
1734 |
+
.col-sm-offset-1 {
|
1735 |
+
margin-left: 8.33333333%;
|
1736 |
+
}
|
1737 |
+
.col-sm-offset-0 {
|
1738 |
+
margin-left: 0;
|
1739 |
+
}
|
1740 |
+
}
|
1741 |
+
@media (min-width: 992px) {
|
1742 |
+
.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {
|
1743 |
+
float: left;
|
1744 |
+
}
|
1745 |
+
.col-md-12 {
|
1746 |
+
width: 100%;
|
1747 |
+
}
|
1748 |
+
.col-md-11 {
|
1749 |
+
width: 91.66666667%;
|
1750 |
+
}
|
1751 |
+
.col-md-10 {
|
1752 |
+
width: 83.33333333%;
|
1753 |
+
}
|
1754 |
+
.col-md-9 {
|
1755 |
+
width: 75%;
|
1756 |
+
}
|
1757 |
+
.col-md-8 {
|
1758 |
+
width: 66.66666667%;
|
1759 |
+
}
|
1760 |
+
.col-md-7 {
|
1761 |
+
width: 58.33333333%;
|
1762 |
+
}
|
1763 |
+
.col-md-6 {
|
1764 |
+
width: 50%;
|
1765 |
+
}
|
1766 |
+
.col-md-5 {
|
1767 |
+
width: 41.66666667%;
|
1768 |
+
}
|
1769 |
+
.col-md-4 {
|
1770 |
+
width: 33.33333333%;
|
1771 |
+
}
|
1772 |
+
.col-md-3 {
|
1773 |
+
width: 25%;
|
1774 |
+
}
|
1775 |
+
.col-md-2 {
|
1776 |
+
width: 16.66666667%;
|
1777 |
+
}
|
1778 |
+
.col-md-1 {
|
1779 |
+
width: 8.33333333%;
|
1780 |
+
}
|
1781 |
+
.col-md-pull-12 {
|
1782 |
+
right: 100%;
|
1783 |
+
}
|
1784 |
+
.col-md-pull-11 {
|
1785 |
+
right: 91.66666667%;
|
1786 |
+
}
|
1787 |
+
.col-md-pull-10 {
|
1788 |
+
right: 83.33333333%;
|
1789 |
+
}
|
1790 |
+
.col-md-pull-9 {
|
1791 |
+
right: 75%;
|
1792 |
+
}
|
1793 |
+
.col-md-pull-8 {
|
1794 |
+
right: 66.66666667%;
|
1795 |
+
}
|
1796 |
+
.col-md-pull-7 {
|
1797 |
+
right: 58.33333333%;
|
1798 |
+
}
|
1799 |
+
.col-md-pull-6 {
|
1800 |
+
right: 50%;
|
1801 |
+
}
|
1802 |
+
.col-md-pull-5 {
|
1803 |
+
right: 41.66666667%;
|
1804 |
+
}
|
1805 |
+
.col-md-pull-4 {
|
1806 |
+
right: 33.33333333%;
|
1807 |
+
}
|
1808 |
+
.col-md-pull-3 {
|
1809 |
+
right: 25%;
|
1810 |
+
}
|
1811 |
+
.col-md-pull-2 {
|
1812 |
+
right: 16.66666667%;
|
1813 |
+
}
|
1814 |
+
.col-md-pull-1 {
|
1815 |
+
right: 8.33333333%;
|
1816 |
+
}
|
1817 |
+
.col-md-pull-0 {
|
1818 |
+
right: auto;
|
1819 |
+
}
|
1820 |
+
.col-md-push-12 {
|
1821 |
+
left: 100%;
|
1822 |
+
}
|
1823 |
+
.col-md-push-11 {
|
1824 |
+
left: 91.66666667%;
|
1825 |
+
}
|
1826 |
+
.col-md-push-10 {
|
1827 |
+
left: 83.33333333%;
|
1828 |
+
}
|
1829 |
+
.col-md-push-9 {
|
1830 |
+
left: 75%;
|
1831 |
+
}
|
1832 |
+
.col-md-push-8 {
|
1833 |
+
left: 66.66666667%;
|
1834 |
+
}
|
1835 |
+
.col-md-push-7 {
|
1836 |
+
left: 58.33333333%;
|
1837 |
+
}
|
1838 |
+
.col-md-push-6 {
|
1839 |
+
left: 50%;
|
1840 |
+
}
|
1841 |
+
.col-md-push-5 {
|
1842 |
+
left: 41.66666667%;
|
1843 |
+
}
|
1844 |
+
.col-md-push-4 {
|
1845 |
+
left: 33.33333333%;
|
1846 |
+
}
|
1847 |
+
.col-md-push-3 {
|
1848 |
+
left: 25%;
|
1849 |
+
}
|
1850 |
+
.col-md-push-2 {
|
1851 |
+
left: 16.66666667%;
|
1852 |
+
}
|
1853 |
+
.col-md-push-1 {
|
1854 |
+
left: 8.33333333%;
|
1855 |
+
}
|
1856 |
+
.col-md-push-0 {
|
1857 |
+
left: auto;
|
1858 |
+
}
|
1859 |
+
.col-md-offset-12 {
|
1860 |
+
margin-left: 100%;
|
1861 |
+
}
|
1862 |
+
.col-md-offset-11 {
|
1863 |
+
margin-left: 91.66666667%;
|
1864 |
+
}
|
1865 |
+
.col-md-offset-10 {
|
1866 |
+
margin-left: 83.33333333%;
|
1867 |
+
}
|
1868 |
+
.col-md-offset-9 {
|
1869 |
+
margin-left: 75%;
|
1870 |
+
}
|
1871 |
+
.col-md-offset-8 {
|
1872 |
+
margin-left: 66.66666667%;
|
1873 |
+
}
|
1874 |
+
.col-md-offset-7 {
|
1875 |
+
margin-left: 58.33333333%;
|
1876 |
+
}
|
1877 |
+
.col-md-offset-6 {
|
1878 |
+
margin-left: 50%;
|
1879 |
+
}
|
1880 |
+
.col-md-offset-5 {
|
1881 |
+
margin-left: 41.66666667%;
|
1882 |
+
}
|
1883 |
+
.col-md-offset-4 {
|
1884 |
+
margin-left: 33.33333333%;
|
1885 |
+
}
|
1886 |
+
.col-md-offset-3 {
|
1887 |
+
margin-left: 25%;
|
1888 |
+
}
|
1889 |
+
.col-md-offset-2 {
|
1890 |
+
margin-left: 16.66666667%;
|
1891 |
+
}
|
1892 |
+
.col-md-offset-1 {
|
1893 |
+
margin-left: 8.33333333%;
|
1894 |
+
}
|
1895 |
+
.col-md-offset-0 {
|
1896 |
+
margin-left: 0;
|
1897 |
+
}
|
1898 |
+
}
|
1899 |
+
@media (min-width: 1200px) {
|
1900 |
+
.col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {
|
1901 |
+
float: left;
|
1902 |
+
}
|
1903 |
+
.col-lg-12 {
|
1904 |
+
width: 100%;
|
1905 |
+
}
|
1906 |
+
.col-lg-11 {
|
1907 |
+
width: 91.66666667%;
|
1908 |
+
}
|
1909 |
+
.col-lg-10 {
|
1910 |
+
width: 83.33333333%;
|
1911 |
+
}
|
1912 |
+
.col-lg-9 {
|
1913 |
+
width: 75%;
|
1914 |
+
}
|
1915 |
+
.col-lg-8 {
|
1916 |
+
width: 66.66666667%;
|
1917 |
+
}
|
1918 |
+
.col-lg-7 {
|
1919 |
+
width: 58.33333333%;
|
1920 |
+
}
|
1921 |
+
.col-lg-6 {
|
1922 |
+
width: 50%;
|
1923 |
+
}
|
1924 |
+
.col-lg-5 {
|
1925 |
+
width: 41.66666667%;
|
1926 |
+
}
|
1927 |
+
.col-lg-4 {
|
1928 |
+
width: 33.33333333%;
|
1929 |
+
}
|
1930 |
+
.col-lg-3 {
|
1931 |
+
width: 25%;
|
1932 |
+
}
|
1933 |
+
.col-lg-2 {
|
1934 |
+
width: 16.66666667%;
|
1935 |
+
}
|
1936 |
+
.col-lg-1 {
|
1937 |
+
width: 8.33333333%;
|
1938 |
+
}
|
1939 |
+
.col-lg-pull-12 {
|
1940 |
+
right: 100%;
|
1941 |
+
}
|
1942 |
+
.col-lg-pull-11 {
|
1943 |
+
right: 91.66666667%;
|
1944 |
+
}
|
1945 |
+
.col-lg-pull-10 {
|
1946 |
+
right: 83.33333333%;
|
1947 |
+
}
|
1948 |
+
.col-lg-pull-9 {
|
1949 |
+
right: 75%;
|
1950 |
+
}
|
1951 |
+
.col-lg-pull-8 {
|
1952 |
+
right: 66.66666667%;
|
1953 |
+
}
|
1954 |
+
.col-lg-pull-7 {
|
1955 |
+
right: 58.33333333%;
|
1956 |
+
}
|
1957 |
+
.col-lg-pull-6 {
|
1958 |
+
right: 50%;
|
1959 |
+
}
|
1960 |
+
.col-lg-pull-5 {
|
1961 |
+
right: 41.66666667%;
|
1962 |
+
}
|
1963 |
+
.col-lg-pull-4 {
|
1964 |
+
right: 33.33333333%;
|
1965 |
+
}
|
1966 |
+
.col-lg-pull-3 {
|
1967 |
+
right: 25%;
|
1968 |
+
}
|
1969 |
+
.col-lg-pull-2 {
|
1970 |
+
right: 16.66666667%;
|
1971 |
+
}
|
1972 |
+
.col-lg-pull-1 {
|
1973 |
+
right: 8.33333333%;
|
1974 |
+
}
|
1975 |
+
.col-lg-pull-0 {
|
1976 |
+
right: auto;
|
1977 |
+
}
|
1978 |
+
.col-lg-push-12 {
|
1979 |
+
left: 100%;
|
1980 |
+
}
|
1981 |
+
.col-lg-push-11 {
|
1982 |
+
left: 91.66666667%;
|
1983 |
+
}
|
1984 |
+
.col-lg-push-10 {
|
1985 |
+
left: 83.33333333%;
|
1986 |
+
}
|
1987 |
+
.col-lg-push-9 {
|
1988 |
+
left: 75%;
|
1989 |
+
}
|
1990 |
+
.col-lg-push-8 {
|
1991 |
+
left: 66.66666667%;
|
1992 |
+
}
|
1993 |
+
.col-lg-push-7 {
|
1994 |
+
left: 58.33333333%;
|
1995 |
+
}
|
1996 |
+
.col-lg-push-6 {
|
1997 |
+
left: 50%;
|
1998 |
+
}
|
1999 |
+
.col-lg-push-5 {
|
2000 |
+
left: 41.66666667%;
|
2001 |
+
}
|
2002 |
+
.col-lg-push-4 {
|
2003 |
+
left: 33.33333333%;
|
2004 |
+
}
|
2005 |
+
.col-lg-push-3 {
|
2006 |
+
left: 25%;
|
2007 |
+
}
|
2008 |
+
.col-lg-push-2 {
|
2009 |
+
left: 16.66666667%;
|
2010 |
+
}
|
2011 |
+
.col-lg-push-1 {
|
2012 |
+
left: 8.33333333%;
|
2013 |
+
}
|
2014 |
+
.col-lg-push-0 {
|
2015 |
+
left: auto;
|
2016 |
+
}
|
2017 |
+
.col-lg-offset-12 {
|
2018 |
+
margin-left: 100%;
|
2019 |
+
}
|
2020 |
+
.col-lg-offset-11 {
|
2021 |
+
margin-left: 91.66666667%;
|
2022 |
+
}
|
2023 |
+
.col-lg-offset-10 {
|
2024 |
+
margin-left: 83.33333333%;
|
2025 |
+
}
|
2026 |
+
.col-lg-offset-9 {
|
2027 |
+
margin-left: 75%;
|
2028 |
+
}
|
2029 |
+
.col-lg-offset-8 {
|
2030 |
+
margin-left: 66.66666667%;
|
2031 |
+
}
|
2032 |
+
.col-lg-offset-7 {
|
2033 |
+
margin-left: 58.33333333%;
|
2034 |
+
}
|
2035 |
+
.col-lg-offset-6 {
|
2036 |
+
margin-left: 50%;
|
2037 |
+
}
|
2038 |
+
.col-lg-offset-5 {
|
2039 |
+
margin-left: 41.66666667%;
|
2040 |
+
}
|
2041 |
+
.col-lg-offset-4 {
|
2042 |
+
margin-left: 33.33333333%;
|
2043 |
+
}
|
2044 |
+
.col-lg-offset-3 {
|
2045 |
+
margin-left: 25%;
|
2046 |
+
}
|
2047 |
+
.col-lg-offset-2 {
|
2048 |
+
margin-left: 16.66666667%;
|
2049 |
+
}
|
2050 |
+
.col-lg-offset-1 {
|
2051 |
+
margin-left: 8.33333333%;
|
2052 |
+
}
|
2053 |
+
.col-lg-offset-0 {
|
2054 |
+
margin-left: 0;
|
2055 |
+
}
|
2056 |
+
}
|
2057 |
+
table {
|
2058 |
+
background-color: transparent;
|
2059 |
+
}
|
2060 |
+
caption {
|
2061 |
+
padding-top: 8px;
|
2062 |
+
padding-bottom: 8px;
|
2063 |
+
color: #777;
|
2064 |
+
text-align: left;
|
2065 |
+
}
|
2066 |
+
th {
|
2067 |
+
text-align: left;
|
2068 |
+
}
|
2069 |
+
.table {
|
2070 |
+
width: 100%;
|
2071 |
+
max-width: 100%;
|
2072 |
+
margin-bottom: 20px;
|
2073 |
+
}
|
2074 |
+
.table > thead > tr > th,
|
2075 |
+
.table > tbody > tr > th,
|
2076 |
+
.table > tfoot > tr > th,
|
2077 |
+
.table > thead > tr > td,
|
2078 |
+
.table > tbody > tr > td,
|
2079 |
+
.table > tfoot > tr > td {
|
2080 |
+
padding: 8px;
|
2081 |
+
line-height: 1.42857143;
|
2082 |
+
vertical-align: top;
|
2083 |
+
border-top: 1px solid #ddd;
|
2084 |
+
}
|
2085 |
+
.table > thead > tr > th {
|
2086 |
+
vertical-align: bottom;
|
2087 |
+
border-bottom: 2px solid #ddd;
|
2088 |
+
}
|
2089 |
+
.table > caption + thead > tr:first-child > th,
|
2090 |
+
.table > colgroup + thead > tr:first-child > th,
|
2091 |
+
.table > thead:first-child > tr:first-child > th,
|
2092 |
+
.table > caption + thead > tr:first-child > td,
|
2093 |
+
.table > colgroup + thead > tr:first-child > td,
|
2094 |
+
.table > thead:first-child > tr:first-child > td {
|
2095 |
+
border-top: 0;
|
2096 |
+
}
|
2097 |
+
.table > tbody + tbody {
|
2098 |
+
border-top: 2px solid #ddd;
|
2099 |
+
}
|
2100 |
+
.table .table {
|
2101 |
+
background-color: #fff;
|
2102 |
+
}
|
2103 |
+
.table-condensed > thead > tr > th,
|
2104 |
+
.table-condensed > tbody > tr > th,
|
2105 |
+
.table-condensed > tfoot > tr > th,
|
2106 |
+
.table-condensed > thead > tr > td,
|
2107 |
+
.table-condensed > tbody > tr > td,
|
2108 |
+
.table-condensed > tfoot > tr > td {
|
2109 |
+
padding: 5px;
|
2110 |
+
}
|
2111 |
+
.table-bordered {
|
2112 |
+
border: 1px solid #ddd;
|
2113 |
+
}
|
2114 |
+
.table-bordered > thead > tr > th,
|
2115 |
+
.table-bordered > tbody > tr > th,
|
2116 |
+
.table-bordered > tfoot > tr > th,
|
2117 |
+
.table-bordered > thead > tr > td,
|
2118 |
+
.table-bordered > tbody > tr > td,
|
2119 |
+
.table-bordered > tfoot > tr > td {
|
2120 |
+
border: 1px solid #ddd;
|
2121 |
+
}
|
2122 |
+
.table-bordered > thead > tr > th,
|
2123 |
+
.table-bordered > thead > tr > td {
|
2124 |
+
border-bottom-width: 2px;
|
2125 |
+
}
|
2126 |
+
.table-striped > tbody > tr:nth-child(odd) {
|
2127 |
+
background-color: #f9f9f9;
|
2128 |
+
}
|
2129 |
+
.table-hover > tbody > tr:hover {
|
2130 |
+
background-color: #f5f5f5;
|
2131 |
+
}
|
2132 |
+
table col[class*="col-"] {
|
2133 |
+
position: static;
|
2134 |
+
display: table-column;
|
2135 |
+
float: none;
|
2136 |
+
}
|
2137 |
+
table td[class*="col-"],
|
2138 |
+
table th[class*="col-"] {
|
2139 |
+
position: static;
|
2140 |
+
display: table-cell;
|
2141 |
+
float: none;
|
2142 |
+
}
|
2143 |
+
.table > thead > tr > td.active,
|
2144 |
+
.table > tbody > tr > td.active,
|
2145 |
+
.table > tfoot > tr > td.active,
|
2146 |
+
.table > thead > tr > th.active,
|
2147 |
+
.table > tbody > tr > th.active,
|
2148 |
+
.table > tfoot > tr > th.active,
|
2149 |
+
.table > thead > tr.active > td,
|
2150 |
+
.table > tbody > tr.active > td,
|
2151 |
+
.table > tfoot > tr.active > td,
|
2152 |
+
.table > thead > tr.active > th,
|
2153 |
+
.table > tbody > tr.active > th,
|
2154 |
+
.table > tfoot > tr.active > th {
|
2155 |
+
background-color: #f5f5f5;
|
2156 |
+
}
|
2157 |
+
.table-hover > tbody > tr > td.active:hover,
|
2158 |
+
.table-hover > tbody > tr > th.active:hover,
|
2159 |
+
.table-hover > tbody > tr.active:hover > td,
|
2160 |
+
.table-hover > tbody > tr:hover > .active,
|
2161 |
+
.table-hover > tbody > tr.active:hover > th {
|
2162 |
+
background-color: #e8e8e8;
|
2163 |
+
}
|
2164 |
+
.table > thead > tr > td.success,
|
2165 |
+
.table > tbody > tr > td.success,
|
2166 |
+
.table > tfoot > tr > td.success,
|
2167 |
+
.table > thead > tr > th.success,
|
2168 |
+
.table > tbody > tr > th.success,
|
2169 |
+
.table > tfoot > tr > th.success,
|
2170 |
+
.table > thead > tr.success > td,
|
2171 |
+
.table > tbody > tr.success > td,
|
2172 |
+
.table > tfoot > tr.success > td,
|
2173 |
+
.table > thead > tr.success > th,
|
2174 |
+
.table > tbody > tr.success > th,
|
2175 |
+
.table > tfoot > tr.success > th {
|
2176 |
+
background-color: #dff0d8;
|
2177 |
+
}
|
2178 |
+
.table-hover > tbody > tr > td.success:hover,
|
2179 |
+
.table-hover > tbody > tr > th.success:hover,
|
2180 |
+
.table-hover > tbody > tr.success:hover > td,
|
2181 |
+
.table-hover > tbody > tr:hover > .success,
|
2182 |
+
.table-hover > tbody > tr.success:hover > th {
|
2183 |
+
background-color: #d0e9c6;
|
2184 |
+
}
|
2185 |
+
.table > thead > tr > td.info,
|
2186 |
+
.table > tbody > tr > td.info,
|
2187 |
+
.table > tfoot > tr > td.info,
|
2188 |
+
.table > thead > tr > th.info,
|
2189 |
+
.table > tbody > tr > th.info,
|
2190 |
+
.table > tfoot > tr > th.info,
|
2191 |
+
.table > thead > tr.info > td,
|
2192 |
+
.table > tbody > tr.info > td,
|
2193 |
+
.table > tfoot > tr.info > td,
|
2194 |
+
.table > thead > tr.info > th,
|
2195 |
+
.table > tbody > tr.info > th,
|
2196 |
+
.table > tfoot > tr.info > th {
|
2197 |
+
background-color: #d9edf7;
|
2198 |
+
}
|
2199 |
+
.table-hover > tbody > tr > td.info:hover,
|
2200 |
+
.table-hover > tbody > tr > th.info:hover,
|
2201 |
+
.table-hover > tbody > tr.info:hover > td,
|
2202 |
+
.table-hover > tbody > tr:hover > .info,
|
2203 |
+
.table-hover > tbody > tr.info:hover > th {
|
2204 |
+
background-color: #c4e3f3;
|
2205 |
+
}
|
2206 |
+
.table > thead > tr > td.warning,
|
2207 |
+
.table > tbody > tr > td.warning,
|
2208 |
+
.table > tfoot > tr > td.warning,
|
2209 |
+
.table > thead > tr > th.warning,
|
2210 |
+
.table > tbody > tr > th.warning,
|
2211 |
+
.table > tfoot > tr > th.warning,
|
2212 |
+
.table > thead > tr.warning > td,
|
2213 |
+
.table > tbody > tr.warning > td,
|
2214 |
+
.table > tfoot > tr.warning > td,
|
2215 |
+
.table > thead > tr.warning > th,
|
2216 |
+
.table > tbody > tr.warning > th,
|
2217 |
+
.table > tfoot > tr.warning > th {
|
2218 |
+
background-color: #fcf8e3;
|
2219 |
+
}
|
2220 |
+
.table-hover > tbody > tr > td.warning:hover,
|
2221 |
+
.table-hover > tbody > tr > th.warning:hover,
|
2222 |
+
.table-hover > tbody > tr.warning:hover > td,
|
2223 |
+
.table-hover > tbody > tr:hover > .warning,
|
2224 |
+
.table-hover > tbody > tr.warning:hover > th {
|
2225 |
+
background-color: #faf2cc;
|
2226 |
+
}
|
2227 |
+
.table > thead > tr > td.danger,
|
2228 |
+
.table > tbody > tr > td.danger,
|
2229 |
+
.table > tfoot > tr > td.danger,
|
2230 |
+
.table > thead > tr > th.danger,
|
2231 |
+
.table > tbody > tr > th.danger,
|
2232 |
+
.table > tfoot > tr > th.danger,
|
2233 |
+
.table > thead > tr.danger > td,
|
2234 |
+
.table > tbody > tr.danger > td,
|
2235 |
+
.table > tfoot > tr.danger > td,
|
2236 |
+
.table > thead > tr.danger > th,
|
2237 |
+
.table > tbody > tr.danger > th,
|
2238 |
+
.table > tfoot > tr.danger > th {
|
2239 |
+
background-color: #f2dede;
|
2240 |
+
}
|
2241 |
+
.table-hover > tbody > tr > td.danger:hover,
|
2242 |
+
.table-hover > tbody > tr > th.danger:hover,
|
2243 |
+
.table-hover > tbody > tr.danger:hover > td,
|
2244 |
+
.table-hover > tbody > tr:hover > .danger,
|
2245 |
+
.table-hover > tbody > tr.danger:hover > th {
|
2246 |
+
background-color: #ebcccc;
|
2247 |
+
}
|
2248 |
+
.table-responsive {
|
2249 |
+
min-height: .01%;
|
2250 |
+
overflow-x: auto;
|
2251 |
+
}
|
2252 |
+
@media screen and (max-width: 767px) {
|
2253 |
+
.table-responsive {
|
2254 |
+
width: 100%;
|
2255 |
+
margin-bottom: 15px;
|
2256 |
+
overflow-y: hidden;
|
2257 |
+
-ms-overflow-style: -ms-autohiding-scrollbar;
|
2258 |
+
border: 1px solid #ddd;
|
2259 |
+
}
|
2260 |
+
.table-responsive > .table {
|
2261 |
+
margin-bottom: 0;
|
2262 |
+
}
|
2263 |
+
.table-responsive > .table > thead > tr > th,
|
2264 |
+
.table-responsive > .table > tbody > tr > th,
|
2265 |
+
.table-responsive > .table > tfoot > tr > th,
|
2266 |
+
.table-responsive > .table > thead > tr > td,
|
2267 |
+
.table-responsive > .table > tbody > tr > td,
|
2268 |
+
.table-responsive > .table > tfoot > tr > td {
|
2269 |
+
white-space: nowrap;
|
2270 |
+
}
|
2271 |
+
.table-responsive > .table-bordered {
|
2272 |
+
border: 0;
|
2273 |
+
}
|
2274 |
+
.table-responsive > .table-bordered > thead > tr > th:first-child,
|
2275 |
+
.table-responsive > .table-bordered > tbody > tr > th:first-child,
|
2276 |
+
.table-responsive > .table-bordered > tfoot > tr > th:first-child,
|
2277 |
+
.table-responsive > .table-bordered > thead > tr > td:first-child,
|
2278 |
+
.table-responsive > .table-bordered > tbody > tr > td:first-child,
|
2279 |
+
.table-responsive > .table-bordered > tfoot > tr > td:first-child {
|
2280 |
+
border-left: 0;
|
2281 |
+
}
|
2282 |
+
.table-responsive > .table-bordered > thead > tr > th:last-child,
|
2283 |
+
.table-responsive > .table-bordered > tbody > tr > th:last-child,
|
2284 |
+
.table-responsive > .table-bordered > tfoot > tr > th:last-child,
|
2285 |
+
.table-responsive > .table-bordered > thead > tr > td:last-child,
|
2286 |
+
.table-responsive > .table-bordered > tbody > tr > td:last-child,
|
2287 |
+
.table-responsive > .table-bordered > tfoot > tr > td:last-child {
|
2288 |
+
border-right: 0;
|
2289 |
+
}
|
2290 |
+
.table-responsive > .table-bordered > tbody > tr:last-child > th,
|
2291 |
+
.table-responsive > .table-bordered > tfoot > tr:last-child > th,
|
2292 |
+
.table-responsive > .table-bordered > tbody > tr:last-child > td,
|
2293 |
+
.table-responsive > .table-bordered > tfoot > tr:last-child > td {
|
2294 |
+
border-bottom: 0;
|
2295 |
+
}
|
2296 |
+
}
|
2297 |
+
fieldset {
|
2298 |
+
min-width: 0;
|
2299 |
+
padding: 0;
|
2300 |
+
margin: 0;
|
2301 |
+
border: 0;
|
2302 |
+
}
|
2303 |
+
legend {
|
2304 |
+
display: block;
|
2305 |
+
width: 100%;
|
2306 |
+
padding: 0;
|
2307 |
+
margin-bottom: 20px;
|
2308 |
+
font-size: 21px;
|
2309 |
+
line-height: inherit;
|
2310 |
+
color: #333;
|
2311 |
+
border: 0;
|
2312 |
+
border-bottom: 1px solid #e5e5e5;
|
2313 |
+
}
|
2314 |
+
label {
|
2315 |
+
display: inline-block;
|
2316 |
+
max-width: 100%;
|
2317 |
+
margin-bottom: 5px;
|
2318 |
+
font-weight: bold;
|
2319 |
+
}
|
2320 |
+
input[type="search"] {
|
2321 |
+
-webkit-box-sizing: border-box;
|
2322 |
+
-moz-box-sizing: border-box;
|
2323 |
+
box-sizing: border-box;
|
2324 |
+
}
|
2325 |
+
input[type="radio"],
|
2326 |
+
input[type="checkbox"] {
|
2327 |
+
margin: 4px 0 0;
|
2328 |
+
margin-top: 1px \9;
|
2329 |
+
line-height: normal;
|
2330 |
+
}
|
2331 |
+
input[type="file"] {
|
2332 |
+
display: block;
|
2333 |
+
}
|
2334 |
+
input[type="range"] {
|
2335 |
+
display: block;
|
2336 |
+
width: 100%;
|
2337 |
+
}
|
2338 |
+
select[multiple],
|
2339 |
+
select[size] {
|
2340 |
+
height: auto;
|
2341 |
+
}
|
2342 |
+
input[type="file"]:focus,
|
2343 |
+
input[type="radio"]:focus,
|
2344 |
+
input[type="checkbox"]:focus {
|
2345 |
+
outline: thin dotted;
|
2346 |
+
outline: 5px auto -webkit-focus-ring-color;
|
2347 |
+
outline-offset: -2px;
|
2348 |
+
}
|
2349 |
+
output {
|
2350 |
+
display: block;
|
2351 |
+
padding-top: 7px;
|
2352 |
+
font-size: 14px;
|
2353 |
+
line-height: 1.42857143;
|
2354 |
+
color: #555;
|
2355 |
+
}
|
2356 |
+
.form-control {
|
2357 |
+
display: block;
|
2358 |
+
width: 100%;
|
2359 |
+
height: 34px;
|
2360 |
+
padding: 6px 12px;
|
2361 |
+
font-size: 14px;
|
2362 |
+
line-height: 1.42857143;
|
2363 |
+
color: #555;
|
2364 |
+
background-color: #fff;
|
2365 |
+
background-image: none;
|
2366 |
+
border: 1px solid #ccc;
|
2367 |
+
border-radius: 4px;
|
2368 |
+
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
|
2369 |
+
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
|
2370 |
+
-webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
|
2371 |
+
-o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
|
2372 |
+
transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
|
2373 |
+
}
|
2374 |
+
.form-control:focus {
|
2375 |
+
border-color: #66afe9;
|
2376 |
+
outline: 0;
|
2377 |
+
-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);
|
2378 |
+
box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);
|
2379 |
+
}
|
2380 |
+
.form-control::-moz-placeholder {
|
2381 |
+
color: #999;
|
2382 |
+
opacity: 1;
|
2383 |
+
}
|
2384 |
+
.form-control:-ms-input-placeholder {
|
2385 |
+
color: #999;
|
2386 |
+
}
|
2387 |
+
.form-control::-webkit-input-placeholder {
|
2388 |
+
color: #999;
|
2389 |
+
}
|
2390 |
+
.form-control[disabled],
|
2391 |
+
.form-control[readonly],
|
2392 |
+
fieldset[disabled] .form-control {
|
2393 |
+
cursor: not-allowed;
|
2394 |
+
background-color: #eee;
|
2395 |
+
opacity: 1;
|
2396 |
+
}
|
2397 |
+
textarea.form-control {
|
2398 |
+
height: auto;
|
2399 |
+
}
|
2400 |
+
input[type="search"] {
|
2401 |
+
-webkit-appearance: none;
|
2402 |
+
}
|
2403 |
+
input[type="date"],
|
2404 |
+
input[type="time"],
|
2405 |
+
input[type="datetime-local"],
|
2406 |
+
input[type="month"] {
|
2407 |
+
line-height: 34px;
|
2408 |
+
line-height: 1.42857143 \0;
|
2409 |
+
}
|
2410 |
+
input[type="date"].input-sm,
|
2411 |
+
input[type="time"].input-sm,
|
2412 |
+
input[type="datetime-local"].input-sm,
|
2413 |
+
input[type="month"].input-sm {
|
2414 |
+
line-height: 30px;
|
2415 |
+
line-height: 1.5 \0;
|
2416 |
+
}
|
2417 |
+
input[type="date"].input-lg,
|
2418 |
+
input[type="time"].input-lg,
|
2419 |
+
input[type="datetime-local"].input-lg,
|
2420 |
+
input[type="month"].input-lg {
|
2421 |
+
line-height: 46px;
|
2422 |
+
line-height: 1.33 \0;
|
2423 |
+
}
|
2424 |
+
_:-ms-fullscreen,
|
2425 |
+
:root input[type="date"],
|
2426 |
+
_:-ms-fullscreen,
|
2427 |
+
:root input[type="time"],
|
2428 |
+
_:-ms-fullscreen,
|
2429 |
+
:root input[type="datetime-local"],
|
2430 |
+
_:-ms-fullscreen,
|
2431 |
+
:root input[type="month"] {
|
2432 |
+
line-height: 1.42857143;
|
2433 |
+
}
|
2434 |
+
_:-ms-fullscreen.input-sm,
|
2435 |
+
:root input[type="date"].input-sm,
|
2436 |
+
_:-ms-fullscreen.input-sm,
|
2437 |
+
:root input[type="time"].input-sm,
|
2438 |
+
_:-ms-fullscreen.input-sm,
|
2439 |
+
:root input[type="datetime-local"].input-sm,
|
2440 |
+
_:-ms-fullscreen.input-sm,
|
2441 |
+
:root input[type="month"].input-sm {
|
2442 |
+
line-height: 1.5;
|
2443 |
+
}
|
2444 |
+
_:-ms-fullscreen.input-lg,
|
2445 |
+
:root input[type="date"].input-lg,
|
2446 |
+
_:-ms-fullscreen.input-lg,
|
2447 |
+
:root input[type="time"].input-lg,
|
2448 |
+
_:-ms-fullscreen.input-lg,
|
2449 |
+
:root input[type="datetime-local"].input-lg,
|
2450 |
+
_:-ms-fullscreen.input-lg,
|
2451 |
+
:root input[type="month"].input-lg {
|
2452 |
+
line-height: 1.33;
|
2453 |
+
}
|
2454 |
+
.form-group {
|
2455 |
+
margin-bottom: 15px;
|
2456 |
+
}
|
2457 |
+
.radio,
|
2458 |
+
.checkbox {
|
2459 |
+
position: relative;
|
2460 |
+
display: block;
|
2461 |
+
margin-top: 10px;
|
2462 |
+
margin-bottom: 10px;
|
2463 |
+
}
|
2464 |
+
.radio label,
|
2465 |
+
.checkbox label {
|
2466 |
+
min-height: 20px;
|
2467 |
+
padding-left: 20px;
|
2468 |
+
margin-bottom: 0;
|
2469 |
+
font-weight: normal;
|
2470 |
+
cursor: pointer;
|
2471 |
+
}
|
2472 |
+
.radio input[type="radio"],
|
2473 |
+
.radio-inline input[type="radio"],
|
2474 |
+
.checkbox input[type="checkbox"],
|
2475 |
+
.checkbox-inline input[type="checkbox"] {
|
2476 |
+
position: absolute;
|
2477 |
+
margin-top: 4px \9;
|
2478 |
+
margin-left: -20px;
|
2479 |
+
}
|
2480 |
+
.radio + .radio,
|
2481 |
+
.checkbox + .checkbox {
|
2482 |
+
margin-top: -5px;
|
2483 |
+
}
|
2484 |
+
.radio-inline,
|
2485 |
+
.checkbox-inline {
|
2486 |
+
display: inline-block;
|
2487 |
+
padding-left: 20px;
|
2488 |
+
margin-bottom: 0;
|
2489 |
+
font-weight: normal;
|
2490 |
+
vertical-align: middle;
|
2491 |
+
cursor: pointer;
|
2492 |
+
}
|
2493 |
+
.radio-inline + .radio-inline,
|
2494 |
+
.checkbox-inline + .checkbox-inline {
|
2495 |
+
margin-top: 0;
|
2496 |
+
margin-left: 10px;
|
2497 |
+
}
|
2498 |
+
input[type="radio"][disabled],
|
2499 |
+
input[type="checkbox"][disabled],
|
2500 |
+
input[type="radio"].disabled,
|
2501 |
+
input[type="checkbox"].disabled,
|
2502 |
+
fieldset[disabled] input[type="radio"],
|
2503 |
+
fieldset[disabled] input[type="checkbox"] {
|
2504 |
+
cursor: not-allowed;
|
2505 |
+
}
|
2506 |
+
.radio-inline.disabled,
|
2507 |
+
.checkbox-inline.disabled,
|
2508 |
+
fieldset[disabled] .radio-inline,
|
2509 |
+
fieldset[disabled] .checkbox-inline {
|
2510 |
+
cursor: not-allowed;
|
2511 |
+
}
|
2512 |
+
.radio.disabled label,
|
2513 |
+
.checkbox.disabled label,
|
2514 |
+
fieldset[disabled] .radio label,
|
2515 |
+
fieldset[disabled] .checkbox label {
|
2516 |
+
cursor: not-allowed;
|
2517 |
+
}
|
2518 |
+
.form-control-static {
|
2519 |
+
padding-top: 7px;
|
2520 |
+
padding-bottom: 7px;
|
2521 |
+
margin-bottom: 0;
|
2522 |
+
}
|
2523 |
+
.form-control-static.input-lg,
|
2524 |
+
.form-control-static.input-sm {
|
2525 |
+
padding-right: 0;
|
2526 |
+
padding-left: 0;
|
2527 |
+
}
|
2528 |
+
.input-sm,
|
2529 |
+
.form-group-sm .form-control {
|
2530 |
+
height: 30px;
|
2531 |
+
padding: 5px 10px;
|
2532 |
+
font-size: 12px;
|
2533 |
+
line-height: 1.5;
|
2534 |
+
border-radius: 3px;
|
2535 |
+
}
|
2536 |
+
select.input-sm,
|
2537 |
+
select.form-group-sm .form-control {
|
2538 |
+
height: 30px;
|
2539 |
+
line-height: 30px;
|
2540 |
+
}
|
2541 |
+
textarea.input-sm,
|
2542 |
+
textarea.form-group-sm .form-control,
|
2543 |
+
select[multiple].input-sm,
|
2544 |
+
select[multiple].form-group-sm .form-control {
|
2545 |
+
height: auto;
|
2546 |
+
}
|
2547 |
+
.input-lg,
|
2548 |
+
.form-group-lg .form-control {
|
2549 |
+
height: 46px;
|
2550 |
+
padding: 10px 16px;
|
2551 |
+
font-size: 18px;
|
2552 |
+
line-height: 1.33;
|
2553 |
+
border-radius: 6px;
|
2554 |
+
}
|
2555 |
+
select.input-lg,
|
2556 |
+
select.form-group-lg .form-control {
|
2557 |
+
height: 46px;
|
2558 |
+
line-height: 46px;
|
2559 |
+
}
|
2560 |
+
textarea.input-lg,
|
2561 |
+
textarea.form-group-lg .form-control,
|
2562 |
+
select[multiple].input-lg,
|
2563 |
+
select[multiple].form-group-lg .form-control {
|
2564 |
+
height: auto;
|
2565 |
+
}
|
2566 |
+
.has-feedback {
|
2567 |
+
position: relative;
|
2568 |
+
}
|
2569 |
+
.has-feedback .form-control {
|
2570 |
+
padding-right: 42.5px;
|
2571 |
+
}
|
2572 |
+
.form-control-feedback {
|
2573 |
+
position: absolute;
|
2574 |
+
top: 0;
|
2575 |
+
right: 0;
|
2576 |
+
z-index: 2;
|
2577 |
+
display: block;
|
2578 |
+
width: 34px;
|
2579 |
+
height: 34px;
|
2580 |
+
line-height: 34px;
|
2581 |
+
text-align: center;
|
2582 |
+
pointer-events: none;
|
2583 |
+
}
|
2584 |
+
.input-lg + .form-control-feedback {
|
2585 |
+
width: 46px;
|
2586 |
+
height: 46px;
|
2587 |
+
line-height: 46px;
|
2588 |
+
}
|
2589 |
+
.input-sm + .form-control-feedback {
|
2590 |
+
width: 30px;
|
2591 |
+
height: 30px;
|
2592 |
+
line-height: 30px;
|
2593 |
+
}
|
2594 |
+
.has-success .help-block,
|
2595 |
+
.has-success .control-label,
|
2596 |
+
.has-success .radio,
|
2597 |
+
.has-success .checkbox,
|
2598 |
+
.has-success .radio-inline,
|
2599 |
+
.has-success .checkbox-inline,
|
2600 |
+
.has-success.radio label,
|
2601 |
+
.has-success.checkbox label,
|
2602 |
+
.has-success.radio-inline label,
|
2603 |
+
.has-success.checkbox-inline label {
|
2604 |
+
color: #3c763d;
|
2605 |
+
}
|
2606 |
+
.has-success .form-control {
|
2607 |
+
border-color: #3c763d;
|
2608 |
+
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
|
2609 |
+
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
|
2610 |
+
}
|
2611 |
+
.has-success .form-control:focus {
|
2612 |
+
border-color: #2b542c;
|
2613 |
+
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;
|
2614 |
+
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;
|
2615 |
+
}
|
2616 |
+
.has-success .input-group-addon {
|
2617 |
+
color: #3c763d;
|
2618 |
+
background-color: #dff0d8;
|
2619 |
+
border-color: #3c763d;
|
2620 |
+
}
|
2621 |
+
.has-success .form-control-feedback {
|
2622 |
+
color: #3c763d;
|
2623 |
+
}
|
2624 |
+
.has-warning .help-block,
|
2625 |
+
.has-warning .control-label,
|
2626 |
+
.has-warning .radio,
|
2627 |
+
.has-warning .checkbox,
|
2628 |
+
.has-warning .radio-inline,
|
2629 |
+
.has-warning .checkbox-inline,
|
2630 |
+
.has-warning.radio label,
|
2631 |
+
.has-warning.checkbox label,
|
2632 |
+
.has-warning.radio-inline label,
|
2633 |
+
.has-warning.checkbox-inline label {
|
2634 |
+
color: #8a6d3b;
|
2635 |
+
}
|
2636 |
+
.has-warning .form-control {
|
2637 |
+
border-color: #8a6d3b;
|
2638 |
+
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
|
2639 |
+
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
|
2640 |
+
}
|
2641 |
+
.has-warning .form-control:focus {
|
2642 |
+
border-color: #66512c;
|
2643 |
+
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;
|
2644 |
+
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;
|
2645 |
+
}
|
2646 |
+
.has-warning .input-group-addon {
|
2647 |
+
color: #8a6d3b;
|
2648 |
+
background-color: #fcf8e3;
|
2649 |
+
border-color: #8a6d3b;
|
2650 |
+
}
|
2651 |
+
.has-warning .form-control-feedback {
|
2652 |
+
color: #8a6d3b;
|
2653 |
+
}
|
2654 |
+
.has-error .help-block,
|
2655 |
+
.has-error .control-label,
|
2656 |
+
.has-error .radio,
|
2657 |
+
.has-error .checkbox,
|
2658 |
+
.has-error .radio-inline,
|
2659 |
+
.has-error .checkbox-inline,
|
2660 |
+
.has-error.radio label,
|
2661 |
+
.has-error.checkbox label,
|
2662 |
+
.has-error.radio-inline label,
|
2663 |
+
.has-error.checkbox-inline label {
|
2664 |
+
color: #a94442;
|
2665 |
+
}
|
2666 |
+
.has-error .form-control {
|
2667 |
+
border-color: #a94442;
|
2668 |
+
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
|
2669 |
+
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
|
2670 |
+
}
|
2671 |
+
.has-error .form-control:focus {
|
2672 |
+
border-color: #843534;
|
2673 |
+
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;
|
2674 |
+
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;
|
2675 |
+
}
|
2676 |
+
.has-error .input-group-addon {
|
2677 |
+
color: #a94442;
|
2678 |
+
background-color: #f2dede;
|
2679 |
+
border-color: #a94442;
|
2680 |
+
}
|
2681 |
+
.has-error .form-control-feedback {
|
2682 |
+
color: #a94442;
|
2683 |
+
}
|
2684 |
+
.has-feedback label ~ .form-control-feedback {
|
2685 |
+
top: 25px;
|
2686 |
+
}
|
2687 |
+
.has-feedback label.sr-only ~ .form-control-feedback {
|
2688 |
+
top: 0;
|
2689 |
+
}
|
2690 |
+
.help-block {
|
2691 |
+
display: block;
|
2692 |
+
margin-top: 5px;
|
2693 |
+
margin-bottom: 10px;
|
2694 |
+
color: #737373;
|
2695 |
+
}
|
2696 |
+
@media (min-width: 768px) {
|
2697 |
+
.form-inline .form-group {
|
2698 |
+
display: inline-block;
|
2699 |
+
margin-bottom: 0;
|
2700 |
+
vertical-align: middle;
|
2701 |
+
}
|
2702 |
+
.form-inline .form-control {
|
2703 |
+
display: inline-block;
|
2704 |
+
width: auto;
|
2705 |
+
vertical-align: middle;
|
2706 |
+
}
|
2707 |
+
.form-inline .form-control-static {
|
2708 |
+
display: inline-block;
|
2709 |
+
}
|
2710 |
+
.form-inline .input-group {
|
2711 |
+
display: inline-table;
|
2712 |
+
vertical-align: middle;
|
2713 |
+
}
|
2714 |
+
.form-inline .input-group .input-group-addon,
|
2715 |
+
.form-inline .input-group .input-group-btn,
|
2716 |
+
.form-inline .input-group .form-control {
|
2717 |
+
width: auto;
|
2718 |
+
}
|
2719 |
+
.form-inline .input-group > .form-control {
|
2720 |
+
width: 100%;
|
2721 |
+
}
|
2722 |
+
.form-inline .control-label {
|
2723 |
+
margin-bottom: 0;
|
2724 |
+
vertical-align: middle;
|
2725 |
+
}
|
2726 |
+
.form-inline .radio,
|
2727 |
+
.form-inline .checkbox {
|
2728 |
+
display: inline-block;
|
2729 |
+
margin-top: 0;
|
2730 |
+
margin-bottom: 0;
|
2731 |
+
vertical-align: middle;
|
2732 |
+
}
|
2733 |
+
.form-inline .radio label,
|
2734 |
+
.form-inline .checkbox label {
|
2735 |
+
padding-left: 0;
|
2736 |
+
}
|
2737 |
+
.form-inline .radio input[type="radio"],
|
2738 |
+
.form-inline .checkbox input[type="checkbox"] {
|
2739 |
+
position: relative;
|
2740 |
+
margin-left: 0;
|
2741 |
+
}
|
2742 |
+
.form-inline .has-feedback .form-control-feedback {
|
2743 |
+
top: 0;
|
2744 |
+
}
|
2745 |
+
}
|
2746 |
+
.form-horizontal .radio,
|
2747 |
+
.form-horizontal .checkbox,
|
2748 |
+
.form-horizontal .radio-inline,
|
2749 |
+
.form-horizontal .checkbox-inline {
|
2750 |
+
padding-top: 7px;
|
2751 |
+
margin-top: 0;
|
2752 |
+
margin-bottom: 0;
|
2753 |
+
}
|
2754 |
+
.form-horizontal .radio,
|
2755 |
+
.form-horizontal .checkbox {
|
2756 |
+
min-height: 27px;
|
2757 |
+
}
|
2758 |
+
.form-horizontal .form-group {
|
2759 |
+
margin-right: -15px;
|
2760 |
+
margin-left: -15px;
|
2761 |
+
}
|
2762 |
+
@media (min-width: 768px) {
|
2763 |
+
.form-horizontal .control-label {
|
2764 |
+
padding-top: 7px;
|
2765 |
+
margin-bottom: 0;
|
2766 |
+
text-align: right;
|
2767 |
+
}
|
2768 |
+
}
|
2769 |
+
.form-horizontal .has-feedback .form-control-feedback {
|
2770 |
+
right: 15px;
|
2771 |
+
}
|
2772 |
+
@media (min-width: 768px) {
|
2773 |
+
.form-horizontal .form-group-lg .control-label {
|
2774 |
+
padding-top: 14.3px;
|
2775 |
+
}
|
2776 |
+
}
|
2777 |
+
@media (min-width: 768px) {
|
2778 |
+
.form-horizontal .form-group-sm .control-label {
|
2779 |
+
padding-top: 6px;
|
2780 |
+
}
|
2781 |
+
}
|
2782 |
+
.btn {
|
2783 |
+
display: inline-block;
|
2784 |
+
padding: 6px 12px;
|
2785 |
+
margin-bottom: 0;
|
2786 |
+
font-size: 14px;
|
2787 |
+
font-weight: normal;
|
2788 |
+
line-height: 1.42857143;
|
2789 |
+
text-align: center;
|
2790 |
+
white-space: nowrap;
|
2791 |
+
vertical-align: middle;
|
2792 |
+
-ms-touch-action: manipulation;
|
2793 |
+
touch-action: manipulation;
|
2794 |
+
cursor: pointer;
|
2795 |
+
-webkit-user-select: none;
|
2796 |
+
-moz-user-select: none;
|
2797 |
+
-ms-user-select: none;
|
2798 |
+
user-select: none;
|
2799 |
+
background-image: none;
|
2800 |
+
border: 1px solid transparent;
|
2801 |
+
border-radius: 4px;
|
2802 |
+
}
|
2803 |
+
.btn:focus,
|
2804 |
+
.btn:active:focus,
|
2805 |
+
.btn.active:focus,
|
2806 |
+
.btn.focus,
|
2807 |
+
.btn:active.focus,
|
2808 |
+
.btn.active.focus {
|
2809 |
+
outline: thin dotted;
|
2810 |
+
outline: 5px auto -webkit-focus-ring-color;
|
2811 |
+
outline-offset: -2px;
|
2812 |
+
}
|
2813 |
+
.btn:hover,
|
2814 |
+
.btn:focus,
|
2815 |
+
.btn.focus {
|
2816 |
+
color: #333;
|
2817 |
+
text-decoration: none;
|
2818 |
+
}
|
2819 |
+
.btn:active,
|
2820 |
+
.btn.active {
|
2821 |
+
background-image: none;
|
2822 |
+
outline: 0;
|
2823 |
+
-webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
|
2824 |
+
box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
|
2825 |
+
}
|
2826 |
+
.btn.disabled,
|
2827 |
+
.btn[disabled],
|
2828 |
+
fieldset[disabled] .btn {
|
2829 |
+
pointer-events: none;
|
2830 |
+
cursor: not-allowed;
|
2831 |
+
filter: alpha(opacity=65);
|
2832 |
+
-webkit-box-shadow: none;
|
2833 |
+
box-shadow: none;
|
2834 |
+
opacity: .65;
|
2835 |
+
}
|
2836 |
+
.btn-default {
|
2837 |
+
color: #333;
|
2838 |
+
background-color: #fff;
|
2839 |
+
border-color: #ccc;
|
2840 |
+
}
|
2841 |
+
.btn-default:hover,
|
2842 |
+
.btn-default:focus,
|
2843 |
+
.btn-default.focus,
|
2844 |
+
.btn-default:active,
|
2845 |
+
.btn-default.active,
|
2846 |
+
.open > .dropdown-toggle.btn-default {
|
2847 |
+
color: #333;
|
2848 |
+
background-color: #e6e6e6;
|
2849 |
+
border-color: #adadad;
|
2850 |
+
}
|
2851 |
+
.btn-default:active,
|
2852 |
+
.btn-default.active,
|
2853 |
+
.open > .dropdown-toggle.btn-default {
|
2854 |
+
background-image: none;
|
2855 |
+
}
|
2856 |
+
.btn-default.disabled,
|
2857 |
+
.btn-default[disabled],
|
2858 |
+
fieldset[disabled] .btn-default,
|
2859 |
+
.btn-default.disabled:hover,
|
2860 |
+
.btn-default[disabled]:hover,
|
2861 |
+
fieldset[disabled] .btn-default:hover,
|
2862 |
+
.btn-default.disabled:focus,
|
2863 |
+
.btn-default[disabled]:focus,
|
2864 |
+
fieldset[disabled] .btn-default:focus,
|
2865 |
+
.btn-default.disabled.focus,
|
2866 |
+
.btn-default[disabled].focus,
|
2867 |
+
fieldset[disabled] .btn-default.focus,
|
2868 |
+
.btn-default.disabled:active,
|
2869 |
+
.btn-default[disabled]:active,
|
2870 |
+
fieldset[disabled] .btn-default:active,
|
2871 |
+
.btn-default.disabled.active,
|
2872 |
+
.btn-default[disabled].active,
|
2873 |
+
fieldset[disabled] .btn-default.active {
|
2874 |
+
background-color: #fff;
|
2875 |
+
border-color: #ccc;
|
2876 |
+
}
|
2877 |
+
.btn-default .badge {
|
2878 |
+
color: #fff;
|
2879 |
+
background-color: #333;
|
2880 |
+
}
|
2881 |
+
.btn-primary {
|
2882 |
+
color: #fff;
|
2883 |
+
background-color: #428bca;
|
2884 |
+
border-color: #357ebd;
|
2885 |
+
}
|
2886 |
+
.btn-primary:hover,
|
2887 |
+
.btn-primary:focus,
|
2888 |
+
.btn-primary.focus,
|
2889 |
+
.btn-primary:active,
|
2890 |
+
.btn-primary.active,
|
2891 |
+
.open > .dropdown-toggle.btn-primary {
|
2892 |
+
color: #fff;
|
2893 |
+
background-color: #3071a9;
|
2894 |
+
border-color: #285e8e;
|
2895 |
+
}
|
2896 |
+
.btn-primary:active,
|
2897 |
+
.btn-primary.active,
|
2898 |
+
.open > .dropdown-toggle.btn-primary {
|
2899 |
+
background-image: none;
|
2900 |
+
}
|
2901 |
+
.btn-primary.disabled,
|
2902 |
+
.btn-primary[disabled],
|
2903 |
+
fieldset[disabled] .btn-primary,
|
2904 |
+
.btn-primary.disabled:hover,
|
2905 |
+
.btn-primary[disabled]:hover,
|
2906 |
+
fieldset[disabled] .btn-primary:hover,
|
2907 |
+
.btn-primary.disabled:focus,
|
2908 |
+
.btn-primary[disabled]:focus,
|
2909 |
+
fieldset[disabled] .btn-primary:focus,
|
2910 |
+
.btn-primary.disabled.focus,
|
2911 |
+
.btn-primary[disabled].focus,
|
2912 |
+
fieldset[disabled] .btn-primary.focus,
|
2913 |
+
.btn-primary.disabled:active,
|
2914 |
+
.btn-primary[disabled]:active,
|
2915 |
+
fieldset[disabled] .btn-primary:active,
|
2916 |
+
.btn-primary.disabled.active,
|
2917 |
+
.btn-primary[disabled].active,
|
2918 |
+
fieldset[disabled] .btn-primary.active {
|
2919 |
+
background-color: #428bca;
|
2920 |
+
border-color: #357ebd;
|
2921 |
+
}
|
2922 |
+
.btn-primary .badge {
|
2923 |
+
color: #428bca;
|
2924 |
+
background-color: #fff;
|
2925 |
+
}
|
2926 |
+
.btn-success {
|
2927 |
+
color: #fff;
|
2928 |
+
background-color: #5cb85c;
|
2929 |
+
border-color: #4cae4c;
|
2930 |
+
}
|
2931 |
+
.btn-success:hover,
|
2932 |
+
.btn-success:focus,
|
2933 |
+
.btn-success.focus,
|
2934 |
+
.btn-success:active,
|
2935 |
+
.btn-success.active,
|
2936 |
+
.open > .dropdown-toggle.btn-success {
|
2937 |
+
color: #fff;
|
2938 |
+
background-color: #449d44;
|
2939 |
+
border-color: #398439;
|
2940 |
+
}
|
2941 |
+
.btn-success:active,
|
2942 |
+
.btn-success.active,
|
2943 |
+
.open > .dropdown-toggle.btn-success {
|
2944 |
+
background-image: none;
|
2945 |
+
}
|
2946 |
+
.btn-success.disabled,
|
2947 |
+
.btn-success[disabled],
|
2948 |
+
fieldset[disabled] .btn-success,
|
2949 |
+
.btn-success.disabled:hover,
|
2950 |
+
.btn-success[disabled]:hover,
|
2951 |
+
fieldset[disabled] .btn-success:hover,
|
2952 |
+
.btn-success.disabled:focus,
|
2953 |
+
.btn-success[disabled]:focus,
|
2954 |
+
fieldset[disabled] .btn-success:focus,
|
2955 |
+
.btn-success.disabled.focus,
|
2956 |
+
.btn-success[disabled].focus,
|
2957 |
+
fieldset[disabled] .btn-success.focus,
|
2958 |
+
.btn-success.disabled:active,
|
2959 |
+
.btn-success[disabled]:active,
|
2960 |
+
fieldset[disabled] .btn-success:active,
|
2961 |
+
.btn-success.disabled.active,
|
2962 |
+
.btn-success[disabled].active,
|
2963 |
+
fieldset[disabled] .btn-success.active {
|
2964 |
+
background-color: #5cb85c;
|
2965 |
+
border-color: #4cae4c;
|
2966 |
+
}
|
2967 |
+
.btn-success .badge {
|
2968 |
+
color: #5cb85c;
|
2969 |
+
background-color: #fff;
|
2970 |
+
}
|
2971 |
+
.btn-info {
|
2972 |
+
color: #fff;
|
2973 |
+
background-color: #5bc0de;
|
2974 |
+
border-color: #46b8da;
|
2975 |
+
}
|
2976 |
+
.btn-info:hover,
|
2977 |
+
.btn-info:focus,
|
2978 |
+
.btn-info.focus,
|
2979 |
+
.btn-info:active,
|
2980 |
+
.btn-info.active,
|
2981 |
+
.open > .dropdown-toggle.btn-info {
|
2982 |
+
color: #fff;
|
2983 |
+
background-color: #31b0d5;
|
2984 |
+
border-color: #269abc;
|
2985 |
+
}
|
2986 |
+
.btn-info:active,
|
2987 |
+
.btn-info.active,
|
2988 |
+
.open > .dropdown-toggle.btn-info {
|
2989 |
+
background-image: none;
|
2990 |
+
}
|
2991 |
+
.btn-info.disabled,
|
2992 |
+
.btn-info[disabled],
|
2993 |
+
fieldset[disabled] .btn-info,
|
2994 |
+
.btn-info.disabled:hover,
|
2995 |
+
.btn-info[disabled]:hover,
|
2996 |
+
fieldset[disabled] .btn-info:hover,
|
2997 |
+
.btn-info.disabled:focus,
|
2998 |
+
.btn-info[disabled]:focus,
|
2999 |
+
fieldset[disabled] .btn-info:focus,
|
3000 |
+
.btn-info.disabled.focus,
|
3001 |
+
.btn-info[disabled].focus,
|
3002 |
+
fieldset[disabled] .btn-info.focus,
|
3003 |
+
.btn-info.disabled:active,
|
3004 |
+
.btn-info[disabled]:active,
|
3005 |
+
fieldset[disabled] .btn-info:active,
|
3006 |
+
.btn-info.disabled.active,
|
3007 |
+
.btn-info[disabled].active,
|
3008 |
+
fieldset[disabled] .btn-info.active {
|
3009 |
+
background-color: #5bc0de;
|
3010 |
+
border-color: #46b8da;
|
3011 |
+
}
|
3012 |
+
.btn-info .badge {
|
3013 |
+
color: #5bc0de;
|
3014 |
+
background-color: #fff;
|
3015 |
+
}
|
3016 |
+
.btn-warning {
|
3017 |
+
color: #fff;
|
3018 |
+
background-color: #f0ad4e;
|
3019 |
+
border-color: #eea236;
|
3020 |
+
}
|
3021 |
+
.btn-warning:hover,
|
3022 |
+
.btn-warning:focus,
|
3023 |
+
.btn-warning.focus,
|
3024 |
+
.btn-warning:active,
|
3025 |
+
.btn-warning.active,
|
3026 |
+
.open > .dropdown-toggle.btn-warning {
|
3027 |
+
color: #fff;
|
3028 |
+
background-color: #ec971f;
|
3029 |
+
border-color: #d58512;
|
3030 |
+
}
|
3031 |
+
.btn-warning:active,
|
3032 |
+
.btn-warning.active,
|
3033 |
+
.open > .dropdown-toggle.btn-warning {
|
3034 |
+
background-image: none;
|
3035 |
+
}
|
3036 |
+
.btn-warning.disabled,
|
3037 |
+
.btn-warning[disabled],
|
3038 |
+
fieldset[disabled] .btn-warning,
|
3039 |
+
.btn-warning.disabled:hover,
|
3040 |
+
.btn-warning[disabled]:hover,
|
3041 |
+
fieldset[disabled] .btn-warning:hover,
|
3042 |
+
.btn-warning.disabled:focus,
|
3043 |
+
.btn-warning[disabled]:focus,
|
3044 |
+
fieldset[disabled] .btn-warning:focus,
|
3045 |
+
.btn-warning.disabled.focus,
|
3046 |
+
.btn-warning[disabled].focus,
|
3047 |
+
fieldset[disabled] .btn-warning.focus,
|
3048 |
+
.btn-warning.disabled:active,
|
3049 |
+
.btn-warning[disabled]:active,
|
3050 |
+
fieldset[disabled] .btn-warning:active,
|
3051 |
+
.btn-warning.disabled.active,
|
3052 |
+
.btn-warning[disabled].active,
|
3053 |
+
fieldset[disabled] .btn-warning.active {
|
3054 |
+
background-color: #f0ad4e;
|
3055 |
+
border-color: #eea236;
|
3056 |
+
}
|
3057 |
+
.btn-warning .badge {
|
3058 |
+
color: #f0ad4e;
|
3059 |
+
background-color: #fff;
|
3060 |
+
}
|
3061 |
+
.btn-danger {
|
3062 |
+
color: #fff;
|
3063 |
+
background-color: #d9534f;
|
3064 |
+
border-color: #d43f3a;
|
3065 |
+
}
|
3066 |
+
.btn-danger:hover,
|
3067 |
+
.btn-danger:focus,
|
3068 |
+
.btn-danger.focus,
|
3069 |
+
.btn-danger:active,
|
3070 |
+
.btn-danger.active,
|
3071 |
+
.open > .dropdown-toggle.btn-danger {
|
3072 |
+
color: #fff;
|
3073 |
+
background-color: #c9302c;
|
3074 |
+
border-color: #ac2925;
|
3075 |
+
}
|
3076 |
+
.btn-danger:active,
|
3077 |
+
.btn-danger.active,
|
3078 |
+
.open > .dropdown-toggle.btn-danger {
|
3079 |
+
background-image: none;
|
3080 |
+
}
|
3081 |
+
.btn-danger.disabled,
|
3082 |
+
.btn-danger[disabled],
|
3083 |
+
fieldset[disabled] .btn-danger,
|
3084 |
+
.btn-danger.disabled:hover,
|
3085 |
+
.btn-danger[disabled]:hover,
|
3086 |
+
fieldset[disabled] .btn-danger:hover,
|
3087 |
+
.btn-danger.disabled:focus,
|
3088 |
+
.btn-danger[disabled]:focus,
|
3089 |
+
fieldset[disabled] .btn-danger:focus,
|
3090 |
+
.btn-danger.disabled.focus,
|
3091 |
+
.btn-danger[disabled].focus,
|
3092 |
+
fieldset[disabled] .btn-danger.focus,
|
3093 |
+
.btn-danger.disabled:active,
|
3094 |
+
.btn-danger[disabled]:active,
|
3095 |
+
fieldset[disabled] .btn-danger:active,
|
3096 |
+
.btn-danger.disabled.active,
|
3097 |
+
.btn-danger[disabled].active,
|
3098 |
+
fieldset[disabled] .btn-danger.active {
|
3099 |
+
background-color: #d9534f;
|
3100 |
+
border-color: #d43f3a;
|
3101 |
+
}
|
3102 |
+
.btn-danger .badge {
|
3103 |
+
color: #d9534f;
|
3104 |
+
background-color: #fff;
|
3105 |
+
}
|
3106 |
+
.btn-link {
|
3107 |
+
font-weight: normal;
|
3108 |
+
color: #428bca;
|
3109 |
+
border-radius: 0;
|
3110 |
+
}
|
3111 |
+
.btn-link,
|
3112 |
+
.btn-link:active,
|
3113 |
+
.btn-link.active,
|
3114 |
+
.btn-link[disabled],
|
3115 |
+
fieldset[disabled] .btn-link {
|
3116 |
+
background-color: transparent;
|
3117 |
+
-webkit-box-shadow: none;
|
3118 |
+
box-shadow: none;
|
3119 |
+
}
|
3120 |
+
.btn-link,
|
3121 |
+
.btn-link:hover,
|
3122 |
+
.btn-link:focus,
|
3123 |
+
.btn-link:active {
|
3124 |
+
border-color: transparent;
|
3125 |
+
}
|
3126 |
+
.btn-link:hover,
|
3127 |
+
.btn-link:focus {
|
3128 |
+
color: #2a6496;
|
3129 |
+
text-decoration: underline;
|
3130 |
+
background-color: transparent;
|
3131 |
+
}
|
3132 |
+
.btn-link[disabled]:hover,
|
3133 |
+
fieldset[disabled] .btn-link:hover,
|
3134 |
+
.btn-link[disabled]:focus,
|
3135 |
+
fieldset[disabled] .btn-link:focus {
|
3136 |
+
color: #777;
|
3137 |
+
text-decoration: none;
|
3138 |
+
}
|
3139 |
+
.btn-lg,
|
3140 |
+
.btn-group-lg > .btn {
|
3141 |
+
padding: 10px 16px;
|
3142 |
+
font-size: 18px;
|
3143 |
+
line-height: 1.33;
|
3144 |
+
border-radius: 6px;
|
3145 |
+
}
|
3146 |
+
.btn-sm,
|
3147 |
+
.btn-group-sm > .btn {
|
3148 |
+
padding: 5px 10px;
|
3149 |
+
font-size: 12px;
|
3150 |
+
line-height: 1.5;
|
3151 |
+
border-radius: 3px;
|
3152 |
+
}
|
3153 |
+
.btn-xs,
|
3154 |
+
.btn-group-xs > .btn {
|
3155 |
+
padding: 1px 5px;
|
3156 |
+
font-size: 12px;
|
3157 |
+
line-height: 1.5;
|
3158 |
+
border-radius: 3px;
|
3159 |
+
}
|
3160 |
+
.btn-block {
|
3161 |
+
display: block;
|
3162 |
+
width: 100%;
|
3163 |
+
}
|
3164 |
+
.btn-block + .btn-block {
|
3165 |
+
margin-top: 5px;
|
3166 |
+
}
|
3167 |
+
input[type="submit"].btn-block,
|
3168 |
+
input[type="reset"].btn-block,
|
3169 |
+
input[type="button"].btn-block {
|
3170 |
+
width: 100%;
|
3171 |
+
}
|
3172 |
+
.fade {
|
3173 |
+
opacity: 0;
|
3174 |
+
-webkit-transition: opacity .15s linear;
|
3175 |
+
-o-transition: opacity .15s linear;
|
3176 |
+
transition: opacity .15s linear;
|
3177 |
+
}
|
3178 |
+
.fade.in {
|
3179 |
+
opacity: 1;
|
3180 |
+
}
|
3181 |
+
.collapse {
|
3182 |
+
display: none;
|
3183 |
+
visibility: hidden;
|
3184 |
+
}
|
3185 |
+
.collapse.in {
|
3186 |
+
display: block;
|
3187 |
+
visibility: visible;
|
3188 |
+
}
|
3189 |
+
tr.collapse.in {
|
3190 |
+
display: table-row;
|
3191 |
+
}
|
3192 |
+
tbody.collapse.in {
|
3193 |
+
display: table-row-group;
|
3194 |
+
}
|
3195 |
+
.collapsing {
|
3196 |
+
position: relative;
|
3197 |
+
height: 0;
|
3198 |
+
overflow: hidden;
|
3199 |
+
-webkit-transition-timing-function: ease;
|
3200 |
+
-o-transition-timing-function: ease;
|
3201 |
+
transition-timing-function: ease;
|
3202 |
+
-webkit-transition-duration: .35s;
|
3203 |
+
-o-transition-duration: .35s;
|
3204 |
+
transition-duration: .35s;
|
3205 |
+
-webkit-transition-property: height, visibility;
|
3206 |
+
-o-transition-property: height, visibility;
|
3207 |
+
transition-property: height, visibility;
|
3208 |
+
}
|
3209 |
+
.caret {
|
3210 |
+
display: inline-block;
|
3211 |
+
width: 0;
|
3212 |
+
height: 0;
|
3213 |
+
margin-left: 2px;
|
3214 |
+
vertical-align: middle;
|
3215 |
+
border-top: 4px solid;
|
3216 |
+
border-right: 4px solid transparent;
|
3217 |
+
border-left: 4px solid transparent;
|
3218 |
+
}
|
3219 |
+
.dropdown {
|
3220 |
+
position: relative;
|
3221 |
+
}
|
3222 |
+
.dropdown-toggle:focus {
|
3223 |
+
outline: 0;
|
3224 |
+
}
|
3225 |
+
.dropdown-menu {
|
3226 |
+
position: absolute;
|
3227 |
+
top: 100%;
|
3228 |
+
left: 0;
|
3229 |
+
z-index: 1000;
|
3230 |
+
display: none;
|
3231 |
+
float: left;
|
3232 |
+
min-width: 160px;
|
3233 |
+
padding: 5px 0;
|
3234 |
+
margin: 2px 0 0;
|
3235 |
+
font-size: 14px;
|
3236 |
+
text-align: left;
|
3237 |
+
list-style: none;
|
3238 |
+
background-color: #fff;
|
3239 |
+
-webkit-background-clip: padding-box;
|
3240 |
+
background-clip: padding-box;
|
3241 |
+
border: 1px solid #ccc;
|
3242 |
+
border: 1px solid rgba(0, 0, 0, .15);
|
3243 |
+
border-radius: 4px;
|
3244 |
+
-webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
|
3245 |
+
box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
|
3246 |
+
}
|
3247 |
+
.dropdown-menu.pull-right {
|
3248 |
+
right: 0;
|
3249 |
+
left: auto;
|
3250 |
+
}
|
3251 |
+
.dropdown-menu .divider {
|
3252 |
+
height: 1px;
|
3253 |
+
margin: 9px 0;
|
3254 |
+
overflow: hidden;
|
3255 |
+
background-color: #e5e5e5;
|
3256 |
+
}
|
3257 |
+
.dropdown-menu > li > a {
|
3258 |
+
display: block;
|
3259 |
+
padding: 3px 20px;
|
3260 |
+
clear: both;
|
3261 |
+
font-weight: normal;
|
3262 |
+
line-height: 1.42857143;
|
3263 |
+
color: #333;
|
3264 |
+
white-space: nowrap;
|
3265 |
+
}
|
3266 |
+
.dropdown-menu > li > a:hover,
|
3267 |
+
.dropdown-menu > li > a:focus {
|
3268 |
+
color: #262626;
|
3269 |
+
text-decoration: none;
|
3270 |
+
background-color: #f5f5f5;
|
3271 |
+
}
|
3272 |
+
.dropdown-menu > .active > a,
|
3273 |
+
.dropdown-menu > .active > a:hover,
|
3274 |
+
.dropdown-menu > .active > a:focus {
|
3275 |
+
color: #fff;
|
3276 |
+
text-decoration: none;
|
3277 |
+
background-color: #428bca;
|
3278 |
+
outline: 0;
|
3279 |
+
}
|
3280 |
+
.dropdown-menu > .disabled > a,
|
3281 |
+
.dropdown-menu > .disabled > a:hover,
|
3282 |
+
.dropdown-menu > .disabled > a:focus {
|
3283 |
+
color: #777;
|
3284 |
+
}
|
3285 |
+
.dropdown-menu > .disabled > a:hover,
|
3286 |
+
.dropdown-menu > .disabled > a:focus {
|
3287 |
+
text-decoration: none;
|
3288 |
+
cursor: not-allowed;
|
3289 |
+
background-color: transparent;
|
3290 |
+
background-image: none;
|
3291 |
+
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
|
3292 |
+
}
|
3293 |
+
.open > .dropdown-menu {
|
3294 |
+
display: block;
|
3295 |
+
}
|
3296 |
+
.open > a {
|
3297 |
+
outline: 0;
|
3298 |
+
}
|
3299 |
+
.dropdown-menu-right {
|
3300 |
+
right: 0;
|
3301 |
+
left: auto;
|
3302 |
+
}
|
3303 |
+
.dropdown-menu-left {
|
3304 |
+
right: auto;
|
3305 |
+
left: 0;
|
3306 |
+
}
|
3307 |
+
.dropdown-header {
|
3308 |
+
display: block;
|
3309 |
+
padding: 3px 20px;
|
3310 |
+
font-size: 12px;
|
3311 |
+
line-height: 1.42857143;
|
3312 |
+
color: #777;
|
3313 |
+
white-space: nowrap;
|
3314 |
+
}
|
3315 |
+
.dropdown-backdrop {
|
3316 |
+
position: fixed;
|
3317 |
+
top: 0;
|
3318 |
+
right: 0;
|
3319 |
+
bottom: 0;
|
3320 |
+
left: 0;
|
3321 |
+
z-index: 990;
|
3322 |
+
}
|
3323 |
+
.pull-right > .dropdown-menu {
|
3324 |
+
right: 0;
|
3325 |
+
left: auto;
|
3326 |
+
}
|
3327 |
+
.dropup .caret,
|
3328 |
+
.navbar-fixed-bottom .dropdown .caret {
|
3329 |
+
content: "";
|
3330 |
+
border-top: 0;
|
3331 |
+
border-bottom: 4px solid;
|
3332 |
+
}
|
3333 |
+
.dropup .dropdown-menu,
|
3334 |
+
.navbar-fixed-bottom .dropdown .dropdown-menu {
|
3335 |
+
top: auto;
|
3336 |
+
bottom: 100%;
|
3337 |
+
margin-bottom: 1px;
|
3338 |
+
}
|
3339 |
+
@media (min-width: 768px) {
|
3340 |
+
.navbar-right .dropdown-menu {
|
3341 |
+
right: 0;
|
3342 |
+
left: auto;
|
3343 |
+
}
|
3344 |
+
.navbar-right .dropdown-menu-left {
|
3345 |
+
right: auto;
|
3346 |
+
left: 0;
|
3347 |
+
}
|
3348 |
+
}
|
3349 |
+
.btn-group,
|
3350 |
+
.btn-group-vertical {
|
3351 |
+
position: relative;
|
3352 |
+
display: inline-block;
|
3353 |
+
vertical-align: middle;
|
3354 |
+
}
|
3355 |
+
.btn-group > .btn,
|
3356 |
+
.btn-group-vertical > .btn {
|
3357 |
+
position: relative;
|
3358 |
+
float: left;
|
3359 |
+
}
|
3360 |
+
.btn-group > .btn:hover,
|
3361 |
+
.btn-group-vertical > .btn:hover,
|
3362 |
+
.btn-group > .btn:focus,
|
3363 |
+
.btn-group-vertical > .btn:focus,
|
3364 |
+
.btn-group > .btn:active,
|
3365 |
+
.btn-group-vertical > .btn:active,
|
3366 |
+
.btn-group > .btn.active,
|
3367 |
+
.btn-group-vertical > .btn.active {
|
3368 |
+
z-index: 2;
|
3369 |
+
}
|
3370 |
+
.btn-group > .btn:focus,
|
3371 |
+
.btn-group-vertical > .btn:focus {
|
3372 |
+
outline: 0;
|
3373 |
+
}
|
3374 |
+
.btn-group .btn + .btn,
|
3375 |
+
.btn-group .btn + .btn-group,
|
3376 |
+
.btn-group .btn-group + .btn,
|
3377 |
+
.btn-group .btn-group + .btn-group {
|
3378 |
+
margin-left: -1px;
|
3379 |
+
}
|
3380 |
+
.btn-toolbar {
|
3381 |
+
margin-left: -5px;
|
3382 |
+
}
|
3383 |
+
.btn-toolbar .btn-group,
|
3384 |
+
.btn-toolbar .input-group {
|
3385 |
+
float: left;
|
3386 |
+
}
|
3387 |
+
.btn-toolbar > .btn,
|
3388 |
+
.btn-toolbar > .btn-group,
|
3389 |
+
.btn-toolbar > .input-group {
|
3390 |
+
margin-left: 5px;
|
3391 |
+
}
|
3392 |
+
.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
|
3393 |
+
border-radius: 0;
|
3394 |
+
}
|
3395 |
+
.btn-group > .btn:first-child {
|
3396 |
+
margin-left: 0;
|
3397 |
+
}
|
3398 |
+
.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
|
3399 |
+
border-top-right-radius: 0;
|
3400 |
+
border-bottom-right-radius: 0;
|
3401 |
+
}
|
3402 |
+
.btn-group > .btn:last-child:not(:first-child),
|
3403 |
+
.btn-group > .dropdown-toggle:not(:first-child) {
|
3404 |
+
border-top-left-radius: 0;
|
3405 |
+
border-bottom-left-radius: 0;
|
3406 |
+
}
|
3407 |
+
.btn-group > .btn-group {
|
3408 |
+
float: left;
|
3409 |
+
}
|
3410 |
+
.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
|
3411 |
+
border-radius: 0;
|
3412 |
+
}
|
3413 |
+
.btn-group > .btn-group:first-child > .btn:last-child,
|
3414 |
+
.btn-group > .btn-group:first-child > .dropdown-toggle {
|
3415 |
+
border-top-right-radius: 0;
|
3416 |
+
border-bottom-right-radius: 0;
|
3417 |
+
}
|
3418 |
+
.btn-group > .btn-group:last-child > .btn:first-child {
|
3419 |
+
border-top-left-radius: 0;
|
3420 |
+
border-bottom-left-radius: 0;
|
3421 |
+
}
|
3422 |
+
.btn-group .dropdown-toggle:active,
|
3423 |
+
.btn-group.open .dropdown-toggle {
|
3424 |
+
outline: 0;
|
3425 |
+
}
|
3426 |
+
.btn-group > .btn + .dropdown-toggle {
|
3427 |
+
padding-right: 8px;
|
3428 |
+
padding-left: 8px;
|
3429 |
+
}
|
3430 |
+
.btn-group > .btn-lg + .dropdown-toggle {
|
3431 |
+
padding-right: 12px;
|
3432 |
+
padding-left: 12px;
|
3433 |
+
}
|
3434 |
+
.btn-group.open .dropdown-toggle {
|
3435 |
+
-webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
|
3436 |
+
box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
|
3437 |
+
}
|
3438 |
+
.btn-group.open .dropdown-toggle.btn-link {
|
3439 |
+
-webkit-box-shadow: none;
|
3440 |
+
box-shadow: none;
|
3441 |
+
}
|
3442 |
+
.btn .caret {
|
3443 |
+
margin-left: 0;
|
3444 |
+
}
|
3445 |
+
.btn-lg .caret {
|
3446 |
+
border-width: 5px 5px 0;
|
3447 |
+
border-bottom-width: 0;
|
3448 |
+
}
|
3449 |
+
.dropup .btn-lg .caret {
|
3450 |
+
border-width: 0 5px 5px;
|
3451 |
+
}
|
3452 |
+
.btn-group-vertical > .btn,
|
3453 |
+
.btn-group-vertical > .btn-group,
|
3454 |
+
.btn-group-vertical > .btn-group > .btn {
|
3455 |
+
display: block;
|
3456 |
+
float: none;
|
3457 |
+
width: 100%;
|
3458 |
+
max-width: 100%;
|
3459 |
+
}
|
3460 |
+
.btn-group-vertical > .btn-group > .btn {
|
3461 |
+
float: none;
|
3462 |
+
}
|
3463 |
+
.btn-group-vertical > .btn + .btn,
|
3464 |
+
.btn-group-vertical > .btn + .btn-group,
|
3465 |
+
.btn-group-vertical > .btn-group + .btn,
|
3466 |
+
.btn-group-vertical > .btn-group + .btn-group {
|
3467 |
+
margin-top: -1px;
|
3468 |
+
margin-left: 0;
|
3469 |
+
}
|
3470 |
+
.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
|
3471 |
+
border-radius: 0;
|
3472 |
+
}
|
3473 |
+
.btn-group-vertical > .btn:first-child:not(:last-child) {
|
3474 |
+
border-top-right-radius: 4px;
|
3475 |
+
border-bottom-right-radius: 0;
|
3476 |
+
border-bottom-left-radius: 0;
|
3477 |
+
}
|
3478 |
+
.btn-group-vertical > .btn:last-child:not(:first-child) {
|
3479 |
+
border-top-left-radius: 0;
|
3480 |
+
border-top-right-radius: 0;
|
3481 |
+
border-bottom-left-radius: 4px;
|
3482 |
+
}
|
3483 |
+
.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
|
3484 |
+
border-radius: 0;
|
3485 |
+
}
|
3486 |
+
.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,
|
3487 |
+
.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
|
3488 |
+
border-bottom-right-radius: 0;
|
3489 |
+
border-bottom-left-radius: 0;
|
3490 |
+
}
|
3491 |
+
.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
|
3492 |
+
border-top-left-radius: 0;
|
3493 |
+
border-top-right-radius: 0;
|
3494 |
+
}
|
3495 |
+
.btn-group-justified {
|
3496 |
+
display: table;
|
3497 |
+
width: 100%;
|
3498 |
+
table-layout: fixed;
|
3499 |
+
border-collapse: separate;
|
3500 |
+
}
|
3501 |
+
.btn-group-justified > .btn,
|
3502 |
+
.btn-group-justified > .btn-group {
|
3503 |
+
display: table-cell;
|
3504 |
+
float: none;
|
3505 |
+
width: 1%;
|
3506 |
+
}
|
3507 |
+
.btn-group-justified > .btn-group .btn {
|
3508 |
+
width: 100%;
|
3509 |
+
}
|
3510 |
+
.btn-group-justified > .btn-group .dropdown-menu {
|
3511 |
+
left: auto;
|
3512 |
+
}
|
3513 |
+
[data-toggle="buttons"] > .btn input[type="radio"],
|
3514 |
+
[data-toggle="buttons"] > .btn-group > .btn input[type="radio"],
|
3515 |
+
[data-toggle="buttons"] > .btn input[type="checkbox"],
|
3516 |
+
[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] {
|
3517 |
+
position: absolute;
|
3518 |
+
clip: rect(0, 0, 0, 0);
|
3519 |
+
pointer-events: none;
|
3520 |
+
}
|
3521 |
+
.input-group {
|
3522 |
+
position: relative;
|
3523 |
+
display: table;
|
3524 |
+
border-collapse: separate;
|
3525 |
+
}
|
3526 |
+
.input-group[class*="col-"] {
|
3527 |
+
float: none;
|
3528 |
+
padding-right: 0;
|
3529 |
+
padding-left: 0;
|
3530 |
+
}
|
3531 |
+
.input-group .form-control {
|
3532 |
+
position: relative;
|
3533 |
+
z-index: 2;
|
3534 |
+
float: left;
|
3535 |
+
width: 100%;
|
3536 |
+
margin-bottom: 0;
|
3537 |
+
}
|
3538 |
+
.input-group-lg > .form-control,
|
3539 |
+
.input-group-lg > .input-group-addon,
|
3540 |
+
.input-group-lg > .input-group-btn > .btn {
|
3541 |
+
height: 46px;
|
3542 |
+
padding: 10px 16px;
|
3543 |
+
font-size: 18px;
|
3544 |
+
line-height: 1.33;
|
3545 |
+
border-radius: 6px;
|
3546 |
+
}
|
3547 |
+
select.input-group-lg > .form-control,
|
3548 |
+
select.input-group-lg > .input-group-addon,
|
3549 |
+
select.input-group-lg > .input-group-btn > .btn {
|
3550 |
+
height: 46px;
|
3551 |
+
line-height: 46px;
|
3552 |
+
}
|
3553 |
+
textarea.input-group-lg > .form-control,
|
3554 |
+
textarea.input-group-lg > .input-group-addon,
|
3555 |
+
textarea.input-group-lg > .input-group-btn > .btn,
|
3556 |
+
select[multiple].input-group-lg > .form-control,
|
3557 |
+
select[multiple].input-group-lg > .input-group-addon,
|
3558 |
+
select[multiple].input-group-lg > .input-group-btn > .btn {
|
3559 |
+
height: auto;
|
3560 |
+
}
|
3561 |
+
.input-group-sm > .form-control,
|
3562 |
+
.input-group-sm > .input-group-addon,
|
3563 |
+
.input-group-sm > .input-group-btn > .btn {
|
3564 |
+
height: 30px;
|
3565 |
+
padding: 5px 10px;
|
3566 |
+
font-size: 12px;
|
3567 |
+
line-height: 1.5;
|
3568 |
+
border-radius: 3px;
|
3569 |
+
}
|
3570 |
+
select.input-group-sm > .form-control,
|
3571 |
+
select.input-group-sm > .input-group-addon,
|
3572 |
+
select.input-group-sm > .input-group-btn > .btn {
|
3573 |
+
height: 30px;
|
3574 |
+
line-height: 30px;
|
3575 |
+
}
|
3576 |
+
textarea.input-group-sm > .form-control,
|
3577 |
+
textarea.input-group-sm > .input-group-addon,
|
3578 |
+
textarea.input-group-sm > .input-group-btn > .btn,
|
3579 |
+
select[multiple].input-group-sm > .form-control,
|
3580 |
+
select[multiple].input-group-sm > .input-group-addon,
|
3581 |
+
select[multiple].input-group-sm > .input-group-btn > .btn {
|
3582 |
+
height: auto;
|
3583 |
+
}
|
3584 |
+
.input-group-addon,
|
3585 |
+
.input-group-btn,
|
3586 |
+
.input-group .form-control {
|
3587 |
+
display: table-cell;
|
3588 |
+
}
|
3589 |
+
.input-group-addon:not(:first-child):not(:last-child),
|
3590 |
+
.input-group-btn:not(:first-child):not(:last-child),
|
3591 |
+
.input-group .form-control:not(:first-child):not(:last-child) {
|
3592 |
+
border-radius: 0;
|
3593 |
+
}
|
3594 |
+
.input-group-addon,
|
3595 |
+
.input-group-btn {
|
3596 |
+
width: 1%;
|
3597 |
+
white-space: nowrap;
|
3598 |
+
vertical-align: middle;
|
3599 |
+
}
|
3600 |
+
.input-group-addon {
|
3601 |
+
padding: 6px 12px;
|
3602 |
+
font-size: 14px;
|
3603 |
+
font-weight: normal;
|
3604 |
+
line-height: 1;
|
3605 |
+
color: #555;
|
3606 |
+
text-align: center;
|
3607 |
+
background-color: #eee;
|
3608 |
+
border: 1px solid #ccc;
|
3609 |
+
border-radius: 4px;
|
3610 |
+
}
|
3611 |
+
.input-group-addon.input-sm {
|
3612 |
+
padding: 5px 10px;
|
3613 |
+
font-size: 12px;
|
3614 |
+
border-radius: 3px;
|
3615 |
+
}
|
3616 |
+
.input-group-addon.input-lg {
|
3617 |
+
padding: 10px 16px;
|
3618 |
+
font-size: 18px;
|
3619 |
+
border-radius: 6px;
|
3620 |
+
}
|
3621 |
+
.input-group-addon input[type="radio"],
|
3622 |
+
.input-group-addon input[type="checkbox"] {
|
3623 |
+
margin-top: 0;
|
3624 |
+
}
|
3625 |
+
.input-group .form-control:first-child,
|
3626 |
+
.input-group-addon:first-child,
|
3627 |
+
.input-group-btn:first-child > .btn,
|
3628 |
+
.input-group-btn:first-child > .btn-group > .btn,
|
3629 |
+
.input-group-btn:first-child > .dropdown-toggle,
|
3630 |
+
.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
|
3631 |
+
.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
|
3632 |
+
border-top-right-radius: 0;
|
3633 |
+
border-bottom-right-radius: 0;
|
3634 |
+
}
|
3635 |
+
.input-group-addon:first-child {
|
3636 |
+
border-right: 0;
|
3637 |
+
}
|
3638 |
+
.input-group .form-control:last-child,
|
3639 |
+
.input-group-addon:last-child,
|
3640 |
+
.input-group-btn:last-child > .btn,
|
3641 |
+
.input-group-btn:last-child > .btn-group > .btn,
|
3642 |
+
.input-group-btn:last-child > .dropdown-toggle,
|
3643 |
+
.input-group-btn:first-child > .btn:not(:first-child),
|
3644 |
+
.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
|
3645 |
+
border-top-left-radius: 0;
|
3646 |
+
border-bottom-left-radius: 0;
|
3647 |
+
}
|
3648 |
+
.input-group-addon:last-child {
|
3649 |
+
border-left: 0;
|
3650 |
+
}
|
3651 |
+
.input-group-btn {
|
3652 |
+
position: relative;
|
3653 |
+
font-size: 0;
|
3654 |
+
white-space: nowrap;
|
3655 |
+
}
|
3656 |
+
.input-group-btn > .btn {
|
3657 |
+
position: relative;
|
3658 |
+
}
|
3659 |
+
.input-group-btn > .btn + .btn {
|
3660 |
+
margin-left: -1px;
|
3661 |
+
}
|
3662 |
+
.input-group-btn > .btn:hover,
|
3663 |
+
.input-group-btn > .btn:focus,
|
3664 |
+
.input-group-btn > .btn:active {
|
3665 |
+
z-index: 2;
|
3666 |
+
}
|
3667 |
+
.input-group-btn:first-child > .btn,
|
3668 |
+
.input-group-btn:first-child > .btn-group {
|
3669 |
+
margin-right: -1px;
|
3670 |
+
}
|
3671 |
+
.input-group-btn:last-child > .btn,
|
3672 |
+
.input-group-btn:last-child > .btn-group {
|
3673 |
+
margin-left: -1px;
|
3674 |
+
}
|
3675 |
+
.nav {
|
3676 |
+
padding-left: 0;
|
3677 |
+
margin-bottom: 0;
|
3678 |
+
list-style: none;
|
3679 |
+
}
|
3680 |
+
.nav > li {
|
3681 |
+
position: relative;
|
3682 |
+
display: block;
|
3683 |
+
}
|
3684 |
+
.nav > li > a {
|
3685 |
+
position: relative;
|
3686 |
+
display: block;
|
3687 |
+
padding: 10px 15px;
|
3688 |
+
}
|
3689 |
+
.nav > li > a:hover,
|
3690 |
+
.nav > li > a:focus {
|
3691 |
+
text-decoration: none;
|
3692 |
+
background-color: #eee;
|
3693 |
+
}
|
3694 |
+
.nav > li.disabled > a {
|
3695 |
+
color: #777;
|
3696 |
+
}
|
3697 |
+
.nav > li.disabled > a:hover,
|
3698 |
+
.nav > li.disabled > a:focus {
|
3699 |
+
color: #777;
|
3700 |
+
text-decoration: none;
|
3701 |
+
cursor: not-allowed;
|
3702 |
+
background-color: transparent;
|
3703 |
+
}
|
3704 |
+
.nav .open > a,
|
3705 |
+
.nav .open > a:hover,
|
3706 |
+
.nav .open > a:focus {
|
3707 |
+
background-color: #eee;
|
3708 |
+
border-color: #428bca;
|
3709 |
+
}
|
3710 |
+
.nav .nav-divider {
|
3711 |
+
height: 1px;
|
3712 |
+
margin: 9px 0;
|
3713 |
+
overflow: hidden;
|
3714 |
+
background-color: #e5e5e5;
|
3715 |
+
}
|
3716 |
+
.nav > li > a > img {
|
3717 |
+
max-width: none;
|
3718 |
+
}
|
3719 |
+
.nav-tabs {
|
3720 |
+
border-bottom: 1px solid #ddd;
|
3721 |
+
}
|
3722 |
+
.nav-tabs > li {
|
3723 |
+
float: left;
|
3724 |
+
margin-bottom: -1px;
|
3725 |
+
}
|
3726 |
+
.nav-tabs > li > a {
|
3727 |
+
margin-right: 2px;
|
3728 |
+
line-height: 1.42857143;
|
3729 |
+
border: 1px solid transparent;
|
3730 |
+
border-radius: 4px 4px 0 0;
|
3731 |
+
}
|
3732 |
+
.nav-tabs > li > a:hover {
|
3733 |
+
border-color: #eee #eee #ddd;
|
3734 |
+
}
|
3735 |
+
.nav-tabs > li.active > a,
|
3736 |
+
.nav-tabs > li.active > a:hover,
|
3737 |
+
.nav-tabs > li.active > a:focus {
|
3738 |
+
color: #555;
|
3739 |
+
cursor: default;
|
3740 |
+
background-color: #fff;
|
3741 |
+
border: 1px solid #ddd;
|
3742 |
+
border-bottom-color: transparent;
|
3743 |
+
}
|
3744 |
+
.nav-tabs.nav-justified {
|
3745 |
+
width: 100%;
|
3746 |
+
border-bottom: 0;
|
3747 |
+
}
|
3748 |
+
.nav-tabs.nav-justified > li {
|
3749 |
+
float: none;
|
3750 |
+
}
|
3751 |
+
.nav-tabs.nav-justified > li > a {
|
3752 |
+
margin-bottom: 5px;
|
3753 |
+
text-align: center;
|
3754 |
+
}
|
3755 |
+
.nav-tabs.nav-justified > .dropdown .dropdown-menu {
|
3756 |
+
top: auto;
|
3757 |
+
left: auto;
|
3758 |
+
}
|
3759 |
+
@media (min-width: 768px) {
|
3760 |
+
.nav-tabs.nav-justified > li {
|
3761 |
+
display: table-cell;
|
3762 |
+
width: 1%;
|
3763 |
+
}
|
3764 |
+
.nav-tabs.nav-justified > li > a {
|
3765 |
+
margin-bottom: 0;
|
3766 |
+
}
|
3767 |
+
}
|
3768 |
+
.nav-tabs.nav-justified > li > a {
|
3769 |
+
margin-right: 0;
|
3770 |
+
border-radius: 4px;
|
3771 |
+
}
|
3772 |
+
.nav-tabs.nav-justified > .active > a,
|
3773 |
+
.nav-tabs.nav-justified > .active > a:hover,
|
3774 |
+
.nav-tabs.nav-justified > .active > a:focus {
|
3775 |
+
border: 1px solid #ddd;
|
3776 |
+
}
|
3777 |
+
@media (min-width: 768px) {
|
3778 |
+
.nav-tabs.nav-justified > li > a {
|
3779 |
+
border-bottom: 1px solid #ddd;
|
3780 |
+
border-radius: 4px 4px 0 0;
|
3781 |
+
}
|
3782 |
+
.nav-tabs.nav-justified > .active > a,
|
3783 |
+
.nav-tabs.nav-justified > .active > a:hover,
|
3784 |
+
.nav-tabs.nav-justified > .active > a:focus {
|
3785 |
+
border-bottom-color: #fff;
|
3786 |
+
}
|
3787 |
+
}
|
3788 |
+
.nav-pills > li {
|
3789 |
+
float: left;
|
3790 |
+
}
|
3791 |
+
.nav-pills > li > a {
|
3792 |
+
border-radius: 4px;
|
3793 |
+
}
|
3794 |
+
.nav-pills > li + li {
|
3795 |
+
margin-left: 2px;
|
3796 |
+
}
|
3797 |
+
.nav-pills > li.active > a,
|
3798 |
+
.nav-pills > li.active > a:hover,
|
3799 |
+
.nav-pills > li.active > a:focus {
|
3800 |
+
color: #fff;
|
3801 |
+
background-color: #428bca;
|
3802 |
+
}
|
3803 |
+
.nav-stacked > li {
|
3804 |
+
float: none;
|
3805 |
+
}
|
3806 |
+
.nav-stacked > li + li {
|
3807 |
+
margin-top: 2px;
|
3808 |
+
margin-left: 0;
|
3809 |
+
}
|
3810 |
+
.nav-justified {
|
3811 |
+
width: 100%;
|
3812 |
+
}
|
3813 |
+
.nav-justified > li {
|
3814 |
+
float: none;
|
3815 |
+
}
|
3816 |
+
.nav-justified > li > a {
|
3817 |
+
margin-bottom: 5px;
|
3818 |
+
text-align: center;
|
3819 |
+
}
|
3820 |
+
.nav-justified > .dropdown .dropdown-menu {
|
3821 |
+
top: auto;
|
3822 |
+
left: auto;
|
3823 |
+
}
|
3824 |
+
@media (min-width: 768px) {
|
3825 |
+
.nav-justified > li {
|
3826 |
+
display: table-cell;
|
3827 |
+
width: 1%;
|
3828 |
+
}
|
3829 |
+
.nav-justified > li > a {
|
3830 |
+
margin-bottom: 0;
|
3831 |
+
}
|
3832 |
+
}
|
3833 |
+
.nav-tabs-justified {
|
3834 |
+
border-bottom: 0;
|
3835 |
+
}
|
3836 |
+
.nav-tabs-justified > li > a {
|
3837 |
+
margin-right: 0;
|
3838 |
+
border-radius: 4px;
|
3839 |
+
}
|
3840 |
+
.nav-tabs-justified > .active > a,
|
3841 |
+
.nav-tabs-justified > .active > a:hover,
|
3842 |
+
.nav-tabs-justified > .active > a:focus {
|
3843 |
+
border: 1px solid #ddd;
|
3844 |
+
}
|
3845 |
+
@media (min-width: 768px) {
|
3846 |
+
.nav-tabs-justified > li > a {
|
3847 |
+
border-bottom: 1px solid #ddd;
|
3848 |
+
border-radius: 4px 4px 0 0;
|
3849 |
+
}
|
3850 |
+
.nav-tabs-justified > .active > a,
|
3851 |
+
.nav-tabs-justified > .active > a:hover,
|
3852 |
+
.nav-tabs-justified > .active > a:focus {
|
3853 |
+
border-bottom-color: #fff;
|
3854 |
+
}
|
3855 |
+
}
|
3856 |
+
.tab-content > .tab-pane {
|
3857 |
+
display: none;
|
3858 |
+
visibility: hidden;
|
3859 |
+
}
|
3860 |
+
.tab-content > .active {
|
3861 |
+
display: block;
|
3862 |
+
visibility: visible;
|
3863 |
+
}
|
3864 |
+
.nav-tabs .dropdown-menu {
|
3865 |
+
margin-top: -1px;
|
3866 |
+
border-top-left-radius: 0;
|
3867 |
+
border-top-right-radius: 0;
|
3868 |
+
}
|
3869 |
+
.navbar {
|
3870 |
+
position: relative;
|
3871 |
+
min-height: 50px;
|
3872 |
+
margin-bottom: 20px;
|
3873 |
+
border: 1px solid transparent;
|
3874 |
+
}
|
3875 |
+
@media (min-width: 768px) {
|
3876 |
+
.navbar {
|
3877 |
+
border-radius: 4px;
|
3878 |
+
}
|
3879 |
+
}
|
3880 |
+
@media (min-width: 768px) {
|
3881 |
+
.navbar-header {
|
3882 |
+
float: left;
|
3883 |
+
}
|
3884 |
+
}
|
3885 |
+
.navbar-collapse {
|
3886 |
+
padding-right: 15px;
|
3887 |
+
padding-left: 15px;
|
3888 |
+
overflow-x: visible;
|
3889 |
+
-webkit-overflow-scrolling: touch;
|
3890 |
+
border-top: 1px solid transparent;
|
3891 |
+
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);
|
3892 |
+
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);
|
3893 |
+
}
|
3894 |
+
.navbar-collapse.in {
|
3895 |
+
overflow-y: auto;
|
3896 |
+
}
|
3897 |
+
@media (min-width: 768px) {
|
3898 |
+
.navbar-collapse {
|
3899 |
+
width: auto;
|
3900 |
+
border-top: 0;
|
3901 |
+
-webkit-box-shadow: none;
|
3902 |
+
box-shadow: none;
|
3903 |
+
}
|
3904 |
+
.navbar-collapse.collapse {
|
3905 |
+
display: block !important;
|
3906 |
+
height: auto !important;
|
3907 |
+
padding-bottom: 0;
|
3908 |
+
overflow: visible !important;
|
3909 |
+
visibility: visible !important;
|
3910 |
+
}
|
3911 |
+
.navbar-collapse.in {
|
3912 |
+
overflow-y: visible;
|
3913 |
+
}
|
3914 |
+
.navbar-fixed-top .navbar-collapse,
|
3915 |
+
.navbar-static-top .navbar-collapse,
|
3916 |
+
.navbar-fixed-bottom .navbar-collapse {
|
3917 |
+
padding-right: 0;
|
3918 |
+
padding-left: 0;
|
3919 |
+
}
|
3920 |
+
}
|
3921 |
+
.navbar-fixed-top .navbar-collapse,
|
3922 |
+
.navbar-fixed-bottom .navbar-collapse {
|
3923 |
+
max-height: 340px;
|
3924 |
+
}
|
3925 |
+
@media (max-device-width: 480px) and (orientation: landscape) {
|
3926 |
+
.navbar-fixed-top .navbar-collapse,
|
3927 |
+
.navbar-fixed-bottom .navbar-collapse {
|
3928 |
+
max-height: 200px;
|
3929 |
+
}
|
3930 |
+
}
|
3931 |
+
.container > .navbar-header,
|
3932 |
+
.container-fluid > .navbar-header,
|
3933 |
+
.container > .navbar-collapse,
|
3934 |
+
.container-fluid > .navbar-collapse {
|
3935 |
+
margin-right: -15px;
|
3936 |
+
margin-left: -15px;
|
3937 |
+
}
|
3938 |
+
@media (min-width: 768px) {
|
3939 |
+
.container > .navbar-header,
|
3940 |
+
.container-fluid > .navbar-header,
|
3941 |
+
.container > .navbar-collapse,
|
3942 |
+
.container-fluid > .navbar-collapse {
|
3943 |
+
margin-right: 0;
|
3944 |
+
margin-left: 0;
|
3945 |
+
}
|
3946 |
+
}
|
3947 |
+
.navbar-static-top {
|
3948 |
+
z-index: 1000;
|
3949 |
+
border-width: 0 0 1px;
|
3950 |
+
}
|
3951 |
+
@media (min-width: 768px) {
|
3952 |
+
.navbar-static-top {
|
3953 |
+
border-radius: 0;
|
3954 |
+
}
|
3955 |
+
}
|
3956 |
+
.navbar-fixed-top,
|
3957 |
+
.navbar-fixed-bottom {
|
3958 |
+
position: fixed;
|
3959 |
+
right: 0;
|
3960 |
+
left: 0;
|
3961 |
+
z-index: 1030;
|
3962 |
+
}
|
3963 |
+
@media (min-width: 768px) {
|
3964 |
+
.navbar-fixed-top,
|
3965 |
+
.navbar-fixed-bottom {
|
3966 |
+
border-radius: 0;
|
3967 |
+
}
|
3968 |
+
}
|
3969 |
+
.navbar-fixed-top {
|
3970 |
+
top: 0;
|
3971 |
+
border-width: 0 0 1px;
|
3972 |
+
}
|
3973 |
+
.navbar-fixed-bottom {
|
3974 |
+
bottom: 0;
|
3975 |
+
margin-bottom: 0;
|
3976 |
+
border-width: 1px 0 0;
|
3977 |
+
}
|
3978 |
+
.navbar-brand {
|
3979 |
+
float: left;
|
3980 |
+
height: 50px;
|
3981 |
+
padding: 15px 15px;
|
3982 |
+
font-size: 18px;
|
3983 |
+
line-height: 20px;
|
3984 |
+
}
|
3985 |
+
.navbar-brand:hover,
|
3986 |
+
.navbar-brand:focus {
|
3987 |
+
text-decoration: none;
|
3988 |
+
}
|
3989 |
+
.navbar-brand > img {
|
3990 |
+
display: block;
|
3991 |
+
}
|
3992 |
+
@media (min-width: 768px) {
|
3993 |
+
.navbar > .container .navbar-brand,
|
3994 |
+
.navbar > .container-fluid .navbar-brand {
|
3995 |
+
margin-left: -15px;
|
3996 |
+
}
|
3997 |
+
}
|
3998 |
+
.navbar-toggle {
|
3999 |
+
position: relative;
|
4000 |
+
float: right;
|
4001 |
+
padding: 9px 10px;
|
4002 |
+
margin-top: 8px;
|
4003 |
+
margin-right: 15px;
|
4004 |
+
margin-bottom: 8px;
|
4005 |
+
background-color: transparent;
|
4006 |
+
background-image: none;
|
4007 |
+
border: 1px solid transparent;
|
4008 |
+
border-radius: 4px;
|
4009 |
+
}
|
4010 |
+
.navbar-toggle:focus {
|
4011 |
+
outline: 0;
|
4012 |
+
}
|
4013 |
+
.navbar-toggle .icon-bar {
|
4014 |
+
display: block;
|
4015 |
+
width: 22px;
|
4016 |
+
height: 2px;
|
4017 |
+
border-radius: 1px;
|
4018 |
+
}
|
4019 |
+
.navbar-toggle .icon-bar + .icon-bar {
|
4020 |
+
margin-top: 4px;
|
4021 |
+
}
|
4022 |
+
@media (min-width: 768px) {
|
4023 |
+
.navbar-toggle {
|
4024 |
+
display: none;
|
4025 |
+
}
|
4026 |
+
}
|
4027 |
+
.navbar-nav {
|
4028 |
+
margin: 7.5px -15px;
|
4029 |
+
}
|
4030 |
+
.navbar-nav > li > a {
|
4031 |
+
padding-top: 10px;
|
4032 |
+
padding-bottom: 10px;
|
4033 |
+
line-height: 20px;
|
4034 |
+
}
|
4035 |
+
@media (max-width: 767px) {
|
4036 |
+
.navbar-nav .open .dropdown-menu {
|
4037 |
+
position: static;
|
4038 |
+
float: none;
|
4039 |
+
width: auto;
|
4040 |
+
margin-top: 0;
|
4041 |
+
background-color: transparent;
|
4042 |
+
border: 0;
|
4043 |
+
-webkit-box-shadow: none;
|
4044 |
+
box-shadow: none;
|
4045 |
+
}
|
4046 |
+
.navbar-nav .open .dropdown-menu > li > a,
|
4047 |
+
.navbar-nav .open .dropdown-menu .dropdown-header {
|
4048 |
+
padding: 5px 15px 5px 25px;
|
4049 |
+
}
|
4050 |
+
.navbar-nav .open .dropdown-menu > li > a {
|
4051 |
+
line-height: 20px;
|
4052 |
+
}
|
4053 |
+
.navbar-nav .open .dropdown-menu > li > a:hover,
|
4054 |
+
.navbar-nav .open .dropdown-menu > li > a:focus {
|
4055 |
+
background-image: none;
|
4056 |
+
}
|
4057 |
+
}
|
4058 |
+
@media (min-width: 768px) {
|
4059 |
+
.navbar-nav {
|
4060 |
+
float: left;
|
4061 |
+
margin: 0;
|
4062 |
+
}
|
4063 |
+
.navbar-nav > li {
|
4064 |
+
float: left;
|
4065 |
+
}
|
4066 |
+
.navbar-nav > li > a {
|
4067 |
+
padding-top: 15px;
|
4068 |
+
padding-bottom: 15px;
|
4069 |
+
}
|
4070 |
+
}
|
4071 |
+
.navbar-form {
|
4072 |
+
padding: 10px 15px;
|
4073 |
+
margin-top: 8px;
|
4074 |
+
margin-right: -15px;
|
4075 |
+
margin-bottom: 8px;
|
4076 |
+
margin-left: -15px;
|
4077 |
+
border-top: 1px solid transparent;
|
4078 |
+
border-bottom: 1px solid transparent;
|
4079 |
+
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);
|
4080 |
+
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);
|
4081 |
+
}
|
4082 |
+
@media (min-width: 768px) {
|
4083 |
+
.navbar-form .form-group {
|
4084 |
+
display: inline-block;
|
4085 |
+
margin-bottom: 0;
|
4086 |
+
vertical-align: middle;
|
4087 |
+
}
|
4088 |
+
.navbar-form .form-control {
|
4089 |
+
display: inline-block;
|
4090 |
+
width: auto;
|
4091 |
+
vertical-align: middle;
|
4092 |
+
}
|
4093 |
+
.navbar-form .form-control-static {
|
4094 |
+
display: inline-block;
|
4095 |
+
}
|
4096 |
+
.navbar-form .input-group {
|
4097 |
+
display: inline-table;
|
4098 |
+
vertical-align: middle;
|
4099 |
+
}
|
4100 |
+
.navbar-form .input-group .input-group-addon,
|
4101 |
+
.navbar-form .input-group .input-group-btn,
|
4102 |
+
.navbar-form .input-group .form-control {
|
4103 |
+
width: auto;
|
4104 |
+
}
|
4105 |
+
.navbar-form .input-group > .form-control {
|
4106 |
+
width: 100%;
|
4107 |
+
}
|
4108 |
+
.navbar-form .control-label {
|
4109 |
+
margin-bottom: 0;
|
4110 |
+
vertical-align: middle;
|
4111 |
+
}
|
4112 |
+
.navbar-form .radio,
|
4113 |
+
.navbar-form .checkbox {
|
4114 |
+
display: inline-block;
|
4115 |
+
margin-top: 0;
|
4116 |
+
margin-bottom: 0;
|
4117 |
+
vertical-align: middle;
|
4118 |
+
}
|
4119 |
+
.navbar-form .radio label,
|
4120 |
+
.navbar-form .checkbox label {
|
4121 |
+
padding-left: 0;
|
4122 |
+
}
|
4123 |
+
.navbar-form .radio input[type="radio"],
|
4124 |
+
.navbar-form .checkbox input[type="checkbox"] {
|
4125 |
+
position: relative;
|
4126 |
+
margin-left: 0;
|
4127 |
+
}
|
4128 |
+
.navbar-form .has-feedback .form-control-feedback {
|
4129 |
+
top: 0;
|
4130 |
+
}
|
4131 |
+
}
|
4132 |
+
@media (max-width: 767px) {
|
4133 |
+
.navbar-form .form-group {
|
4134 |
+
margin-bottom: 5px;
|
4135 |
+
}
|
4136 |
+
.navbar-form .form-group:last-child {
|
4137 |
+
margin-bottom: 0;
|
4138 |
+
}
|
4139 |
+
}
|
4140 |
+
@media (min-width: 768px) {
|
4141 |
+
.navbar-form {
|
4142 |
+
width: auto;
|
4143 |
+
padding-top: 0;
|
4144 |
+
padding-bottom: 0;
|
4145 |
+
margin-right: 0;
|
4146 |
+
margin-left: 0;
|
4147 |
+
border: 0;
|
4148 |
+
-webkit-box-shadow: none;
|
4149 |
+
box-shadow: none;
|
4150 |
+
}
|
4151 |
+
}
|
4152 |
+
.navbar-nav > li > .dropdown-menu {
|
4153 |
+
margin-top: 0;
|
4154 |
+
border-top-left-radius: 0;
|
4155 |
+
border-top-right-radius: 0;
|
4156 |
+
}
|
4157 |
+
.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
|
4158 |
+
border-bottom-right-radius: 0;
|
4159 |
+
border-bottom-left-radius: 0;
|
4160 |
+
}
|
4161 |
+
.navbar-btn {
|
4162 |
+
margin-top: 8px;
|
4163 |
+
margin-bottom: 8px;
|
4164 |
+
}
|
4165 |
+
.navbar-btn.btn-sm {
|
4166 |
+
margin-top: 10px;
|
4167 |
+
margin-bottom: 10px;
|
4168 |
+
}
|
4169 |
+
.navbar-btn.btn-xs {
|
4170 |
+
margin-top: 14px;
|
4171 |
+
margin-bottom: 14px;
|
4172 |
+
}
|
4173 |
+
.navbar-text {
|
4174 |
+
margin-top: 15px;
|
4175 |
+
margin-bottom: 15px;
|
4176 |
+
}
|
4177 |
+
@media (min-width: 768px) {
|
4178 |
+
.navbar-text {
|
4179 |
+
float: left;
|
4180 |
+
margin-right: 15px;
|
4181 |
+
margin-left: 15px;
|
4182 |
+
}
|
4183 |
+
}
|
4184 |
+
@media (min-width: 768px) {
|
4185 |
+
.navbar-left {
|
4186 |
+
float: left !important;
|
4187 |
+
}
|
4188 |
+
.navbar-right {
|
4189 |
+
float: right !important;
|
4190 |
+
margin-right: -15px;
|
4191 |
+
}
|
4192 |
+
.navbar-right ~ .navbar-right {
|
4193 |
+
margin-right: 0;
|
4194 |
+
}
|
4195 |
+
}
|
4196 |
+
.navbar-default {
|
4197 |
+
background-color: #f8f8f8;
|
4198 |
+
border-color: #e7e7e7;
|
4199 |
+
}
|
4200 |
+
.navbar-default .navbar-brand {
|
4201 |
+
color: #777;
|
4202 |
+
}
|
4203 |
+
.navbar-default .navbar-brand:hover,
|
4204 |
+
.navbar-default .navbar-brand:focus {
|
4205 |
+
color: #5e5e5e;
|
4206 |
+
background-color: transparent;
|
4207 |
+
}
|
4208 |
+
.navbar-default .navbar-text {
|
4209 |
+
color: #777;
|
4210 |
+
}
|
4211 |
+
.navbar-default .navbar-nav > li > a {
|
4212 |
+
color: #777;
|
4213 |
+
}
|
4214 |
+
.navbar-default .navbar-nav > li > a:hover,
|
4215 |
+
.navbar-default .navbar-nav > li > a:focus {
|
4216 |
+
color: #333;
|
4217 |
+
background-color: transparent;
|
4218 |
+
}
|
4219 |
+
.navbar-default .navbar-nav > .active > a,
|
4220 |
+
.navbar-default .navbar-nav > .active > a:hover,
|
4221 |
+
.navbar-default .navbar-nav > .active > a:focus {
|
4222 |
+
color: #555;
|
4223 |
+
background-color: #e7e7e7;
|
4224 |
+
}
|
4225 |
+
.navbar-default .navbar-nav > .disabled > a,
|
4226 |
+
.navbar-default .navbar-nav > .disabled > a:hover,
|
4227 |
+
.navbar-default .navbar-nav > .disabled > a:focus {
|
4228 |
+
color: #ccc;
|
4229 |
+
background-color: transparent;
|
4230 |
+
}
|
4231 |
+
.navbar-default .navbar-toggle {
|
4232 |
+
border-color: #ddd;
|
4233 |
+
}
|
4234 |
+
.navbar-default .navbar-toggle:hover,
|
4235 |
+
.navbar-default .navbar-toggle:focus {
|
4236 |
+
background-color: #ddd;
|
4237 |
+
}
|
4238 |
+
.navbar-default .navbar-toggle .icon-bar {
|
4239 |
+
background-color: #888;
|
4240 |
+
}
|
4241 |
+
.navbar-default .navbar-collapse,
|
4242 |
+
.navbar-default .navbar-form {
|
4243 |
+
border-color: #e7e7e7;
|
4244 |
+
}
|
4245 |
+
.navbar-default .navbar-nav > .open > a,
|
4246 |
+
.navbar-default .navbar-nav > .open > a:hover,
|
4247 |
+
.navbar-default .navbar-nav > .open > a:focus {
|
4248 |
+
color: #555;
|
4249 |
+
background-color: #e7e7e7;
|
4250 |
+
}
|
4251 |
+
@media (max-width: 767px) {
|
4252 |
+
.navbar-default .navbar-nav .open .dropdown-menu > li > a {
|
4253 |
+
color: #777;
|
4254 |
+
}
|
4255 |
+
.navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,
|
4256 |
+
.navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
|
4257 |
+
color: #333;
|
4258 |
+
background-color: transparent;
|
4259 |
+
}
|
4260 |
+
.navbar-default .navbar-nav .open .dropdown-menu > .active > a,
|
4261 |
+
.navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,
|
4262 |
+
.navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
|
4263 |
+
color: #555;
|
4264 |
+
background-color: #e7e7e7;
|
4265 |
+
}
|
4266 |
+
.navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,
|
4267 |
+
.navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,
|
4268 |
+
.navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {
|
4269 |
+
color: #ccc;
|
4270 |
+
background-color: transparent;
|
4271 |
+
}
|
4272 |
+
}
|
4273 |
+
.navbar-default .navbar-link {
|
4274 |
+
color: #777;
|
4275 |
+
}
|
4276 |
+
.navbar-default .navbar-link:hover {
|
4277 |
+
color: #333;
|
4278 |
+
}
|
4279 |
+
.navbar-default .btn-link {
|
4280 |
+
color: #777;
|
4281 |
+
}
|
4282 |
+
.navbar-default .btn-link:hover,
|
4283 |
+
.navbar-default .btn-link:focus {
|
4284 |
+
color: #333;
|
4285 |
+
}
|
4286 |
+
.navbar-default .btn-link[disabled]:hover,
|
4287 |
+
fieldset[disabled] .navbar-default .btn-link:hover,
|
4288 |
+
.navbar-default .btn-link[disabled]:focus,
|
4289 |
+
fieldset[disabled] .navbar-default .btn-link:focus {
|
4290 |
+
color: #ccc;
|
4291 |
+
}
|
4292 |
+
.navbar-inverse {
|
4293 |
+
background-color: #222;
|
4294 |
+
border-color: #080808;
|
4295 |
+
}
|
4296 |
+
.navbar-inverse .navbar-brand {
|
4297 |
+
color: #9d9d9d;
|
4298 |
+
}
|
4299 |
+
.navbar-inverse .navbar-brand:hover,
|
4300 |
+
.navbar-inverse .navbar-brand:focus {
|
4301 |
+
color: #fff;
|
4302 |
+
background-color: transparent;
|
4303 |
+
}
|
4304 |
+
.navbar-inverse .navbar-text {
|
4305 |
+
color: #9d9d9d;
|
4306 |
+
}
|
4307 |
+
.navbar-inverse .navbar-nav > li > a {
|
4308 |
+
color: #9d9d9d;
|
4309 |
+
}
|
4310 |
+
.navbar-inverse .navbar-nav > li > a:hover,
|
4311 |
+
.navbar-inverse .navbar-nav > li > a:focus {
|
4312 |
+
color: #fff;
|
4313 |
+
background-color: transparent;
|
4314 |
+
}
|
4315 |
+
.navbar-inverse .navbar-nav > .active > a,
|
4316 |
+
.navbar-inverse .navbar-nav > .active > a:hover,
|
4317 |
+
.navbar-inverse .navbar-nav > .active > a:focus {
|
4318 |
+
color: #fff;
|
4319 |
+
background-color: #080808;
|
4320 |
+
}
|
4321 |
+
.navbar-inverse .navbar-nav > .disabled > a,
|
4322 |
+
.navbar-inverse .navbar-nav > .disabled > a:hover,
|
4323 |
+
.navbar-inverse .navbar-nav > .disabled > a:focus {
|
4324 |
+
color: #444;
|
4325 |
+
background-color: transparent;
|
4326 |
+
}
|
4327 |
+
.navbar-inverse .navbar-toggle {
|
4328 |
+
border-color: #333;
|
4329 |
+
}
|
4330 |
+
.navbar-inverse .navbar-toggle:hover,
|
4331 |
+
.navbar-inverse .navbar-toggle:focus {
|
4332 |
+
background-color: #333;
|
4333 |
+
}
|
4334 |
+
.navbar-inverse .navbar-toggle .icon-bar {
|
4335 |
+
background-color: #fff;
|
4336 |
+
}
|
4337 |
+
.navbar-inverse .navbar-collapse,
|
4338 |
+
.navbar-inverse .navbar-form {
|
4339 |
+
border-color: #101010;
|
4340 |
+
}
|
4341 |
+
.navbar-inverse .navbar-nav > .open > a,
|
4342 |
+
.navbar-inverse .navbar-nav > .open > a:hover,
|
4343 |
+
.navbar-inverse .navbar-nav > .open > a:focus {
|
4344 |
+
color: #fff;
|
4345 |
+
background-color: #080808;
|
4346 |
+
}
|
4347 |
+
@media (max-width: 767px) {
|
4348 |
+
.navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
|
4349 |
+
border-color: #080808;
|
4350 |
+
}
|
4351 |
+
.navbar-inverse .navbar-nav .open .dropdown-menu .divider {
|
4352 |
+
background-color: #080808;
|
4353 |
+
}
|
4354 |
+
.navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
|
4355 |
+
color: #9d9d9d;
|
4356 |
+
}
|
4357 |
+
.navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,
|
4358 |
+
.navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
|
4359 |
+
color: #fff;
|
4360 |
+
background-color: transparent;
|
4361 |
+
}
|
4362 |
+
.navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,
|
4363 |
+
.navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,
|
4364 |
+
.navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {
|
4365 |
+
color: #fff;
|
4366 |
+
background-color: #080808;
|
4367 |
+
}
|
4368 |
+
.navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,
|
4369 |
+
.navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,
|
4370 |
+
.navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {
|
4371 |
+
color: #444;
|
4372 |
+
background-color: transparent;
|
4373 |
+
}
|
4374 |
+
}
|
4375 |
+
.navbar-inverse .navbar-link {
|
4376 |
+
color: #9d9d9d;
|
4377 |
+
}
|
4378 |
+
.navbar-inverse .navbar-link:hover {
|
4379 |
+
color: #fff;
|
4380 |
+
}
|
4381 |
+
.navbar-inverse .btn-link {
|
4382 |
+
color: #9d9d9d;
|
4383 |
+
}
|
4384 |
+
.navbar-inverse .btn-link:hover,
|
4385 |
+
.navbar-inverse .btn-link:focus {
|
4386 |
+
color: #fff;
|
4387 |
+
}
|
4388 |
+
.navbar-inverse .btn-link[disabled]:hover,
|
4389 |
+
fieldset[disabled] .navbar-inverse .btn-link:hover,
|
4390 |
+
.navbar-inverse .btn-link[disabled]:focus,
|
4391 |
+
fieldset[disabled] .navbar-inverse .btn-link:focus {
|
4392 |
+
color: #444;
|
4393 |
+
}
|
4394 |
+
.breadcrumb {
|
4395 |
+
padding: 8px 15px;
|
4396 |
+
margin-bottom: 20px;
|
4397 |
+
list-style: none;
|
4398 |
+
background-color: #f5f5f5;
|
4399 |
+
border-radius: 4px;
|
4400 |
+
}
|
4401 |
+
.breadcrumb > li {
|
4402 |
+
display: inline-block;
|
4403 |
+
}
|
4404 |
+
.breadcrumb > li + li:before {
|
4405 |
+
padding: 0 5px;
|
4406 |
+
color: #ccc;
|
4407 |
+
content: "/\00a0";
|
4408 |
+
}
|
4409 |
+
.breadcrumb > .active {
|
4410 |
+
color: #777;
|
4411 |
+
}
|
4412 |
+
.pagination {
|
4413 |
+
display: inline-block;
|
4414 |
+
padding-left: 0;
|
4415 |
+
margin: 20px 0;
|
4416 |
+
border-radius: 4px;
|
4417 |
+
}
|
4418 |
+
.pagination > li {
|
4419 |
+
display: inline;
|
4420 |
+
}
|
4421 |
+
.pagination > li > a,
|
4422 |
+
.pagination > li > span {
|
4423 |
+
position: relative;
|
4424 |
+
float: left;
|
4425 |
+
padding: 6px 12px;
|
4426 |
+
margin-left: -1px;
|
4427 |
+
line-height: 1.42857143;
|
4428 |
+
color: #428bca;
|
4429 |
+
text-decoration: none;
|
4430 |
+
background-color: #fff;
|
4431 |
+
border: 1px solid #ddd;
|
4432 |
+
}
|
4433 |
+
.pagination > li:first-child > a,
|
4434 |
+
.pagination > li:first-child > span {
|
4435 |
+
margin-left: 0;
|
4436 |
+
border-top-left-radius: 4px;
|
4437 |
+
border-bottom-left-radius: 4px;
|
4438 |
+
}
|
4439 |
+
.pagination > li:last-child > a,
|
4440 |
+
.pagination > li:last-child > span {
|
4441 |
+
border-top-right-radius: 4px;
|
4442 |
+
border-bottom-right-radius: 4px;
|
4443 |
+
}
|
4444 |
+
.pagination > li > a:hover,
|
4445 |
+
.pagination > li > span:hover,
|
4446 |
+
.pagination > li > a:focus,
|
4447 |
+
.pagination > li > span:focus {
|
4448 |
+
color: #2a6496;
|
4449 |
+
background-color: #eee;
|
4450 |
+
border-color: #ddd;
|
4451 |
+
}
|
4452 |
+
.pagination > .active > a,
|
4453 |
+
.pagination > .active > span,
|
4454 |
+
.pagination > .active > a:hover,
|
4455 |
+
.pagination > .active > span:hover,
|
4456 |
+
.pagination > .active > a:focus,
|
4457 |
+
.pagination > .active > span:focus {
|
4458 |
+
z-index: 2;
|
4459 |
+
color: #fff;
|
4460 |
+
cursor: default;
|
4461 |
+
background-color: #428bca;
|
4462 |
+
border-color: #428bca;
|
4463 |
+
}
|
4464 |
+
.pagination > .disabled > span,
|
4465 |
+
.pagination > .disabled > span:hover,
|
4466 |
+
.pagination > .disabled > span:focus,
|
4467 |
+
.pagination > .disabled > a,
|
4468 |
+
.pagination > .disabled > a:hover,
|
4469 |
+
.pagination > .disabled > a:focus {
|
4470 |
+
color: #777;
|
4471 |
+
cursor: not-allowed;
|
4472 |
+
background-color: #fff;
|
4473 |
+
border-color: #ddd;
|
4474 |
+
}
|
4475 |
+
.pagination-lg > li > a,
|
4476 |
+
.pagination-lg > li > span {
|
4477 |
+
padding: 10px 16px;
|
4478 |
+
font-size: 18px;
|
4479 |
+
}
|
4480 |
+
.pagination-lg > li:first-child > a,
|
4481 |
+
.pagination-lg > li:first-child > span {
|
4482 |
+
border-top-left-radius: 6px;
|
4483 |
+
border-bottom-left-radius: 6px;
|
4484 |
+
}
|
4485 |
+
.pagination-lg > li:last-child > a,
|
4486 |
+
.pagination-lg > li:last-child > span {
|
4487 |
+
border-top-right-radius: 6px;
|
4488 |
+
border-bottom-right-radius: 6px;
|
4489 |
+
}
|
4490 |
+
.pagination-sm > li > a,
|
4491 |
+
.pagination-sm > li > span {
|
4492 |
+
padding: 5px 10px;
|
4493 |
+
font-size: 12px;
|
4494 |
+
}
|
4495 |
+
.pagination-sm > li:first-child > a,
|
4496 |
+
.pagination-sm > li:first-child > span {
|
4497 |
+
border-top-left-radius: 3px;
|
4498 |
+
border-bottom-left-radius: 3px;
|
4499 |
+
}
|
4500 |
+
.pagination-sm > li:last-child > a,
|
4501 |
+
.pagination-sm > li:last-child > span {
|
4502 |
+
border-top-right-radius: 3px;
|
4503 |
+
border-bottom-right-radius: 3px;
|
4504 |
+
}
|
4505 |
+
.pager {
|
4506 |
+
padding-left: 0;
|
4507 |
+
margin: 20px 0;
|
4508 |
+
text-align: center;
|
4509 |
+
list-style: none;
|
4510 |
+
}
|
4511 |
+
.pager li {
|
4512 |
+
display: inline;
|
4513 |
+
}
|
4514 |
+
.pager li > a,
|
4515 |
+
.pager li > span {
|
4516 |
+
display: inline-block;
|
4517 |
+
padding: 5px 14px;
|
4518 |
+
background-color: #fff;
|
4519 |
+
border: 1px solid #ddd;
|
4520 |
+
border-radius: 15px;
|
4521 |
+
}
|
4522 |
+
.pager li > a:hover,
|
4523 |
+
.pager li > a:focus {
|
4524 |
+
text-decoration: none;
|
4525 |
+
background-color: #eee;
|
4526 |
+
}
|
4527 |
+
.pager .next > a,
|
4528 |
+
.pager .next > span {
|
4529 |
+
float: right;
|
4530 |
+
}
|
4531 |
+
.pager .previous > a,
|
4532 |
+
.pager .previous > span {
|
4533 |
+
float: left;
|
4534 |
+
}
|
4535 |
+
.pager .disabled > a,
|
4536 |
+
.pager .disabled > a:hover,
|
4537 |
+
.pager .disabled > a:focus,
|
4538 |
+
.pager .disabled > span {
|
4539 |
+
color: #777;
|
4540 |
+
cursor: not-allowed;
|
4541 |
+
background-color: #fff;
|
4542 |
+
}
|
4543 |
+
.label {
|
4544 |
+
display: inline;
|
4545 |
+
padding: .2em .6em .3em;
|
4546 |
+
font-size: 75%;
|
4547 |
+
font-weight: bold;
|
4548 |
+
line-height: 1;
|
4549 |
+
color: #fff;
|
4550 |
+
text-align: center;
|
4551 |
+
white-space: nowrap;
|
4552 |
+
vertical-align: baseline;
|
4553 |
+
border-radius: .25em;
|
4554 |
+
}
|
4555 |
+
a.label:hover,
|
4556 |
+
a.label:focus {
|
4557 |
+
color: #fff;
|
4558 |
+
text-decoration: none;
|
4559 |
+
cursor: pointer;
|
4560 |
+
}
|
4561 |
+
.label:empty {
|
4562 |
+
display: none;
|
4563 |
+
}
|
4564 |
+
.btn .label {
|
4565 |
+
position: relative;
|
4566 |
+
top: -1px;
|
4567 |
+
}
|
4568 |
+
.label-default {
|
4569 |
+
background-color: #777;
|
4570 |
+
}
|
4571 |
+
.label-default[href]:hover,
|
4572 |
+
.label-default[href]:focus {
|
4573 |
+
background-color: #5e5e5e;
|
4574 |
+
}
|
4575 |
+
.label-primary {
|
4576 |
+
background-color: #428bca;
|
4577 |
+
}
|
4578 |
+
.label-primary[href]:hover,
|
4579 |
+
.label-primary[href]:focus {
|
4580 |
+
background-color: #3071a9;
|
4581 |
+
}
|
4582 |
+
.label-success {
|
4583 |
+
background-color: #5cb85c;
|
4584 |
+
}
|
4585 |
+
.label-success[href]:hover,
|
4586 |
+
.label-success[href]:focus {
|
4587 |
+
background-color: #449d44;
|
4588 |
+
}
|
4589 |
+
.label-info {
|
4590 |
+
background-color: #5bc0de;
|
4591 |
+
}
|
4592 |
+
.label-info[href]:hover,
|
4593 |
+
.label-info[href]:focus {
|
4594 |
+
background-color: #31b0d5;
|
4595 |
+
}
|
4596 |
+
.label-warning {
|
4597 |
+
background-color: #f0ad4e;
|
4598 |
+
}
|
4599 |
+
.label-warning[href]:hover,
|
4600 |
+
.label-warning[href]:focus {
|
4601 |
+
background-color: #ec971f;
|
4602 |
+
}
|
4603 |
+
.label-danger {
|
4604 |
+
background-color: #d9534f;
|
4605 |
+
}
|
4606 |
+
.label-danger[href]:hover,
|
4607 |
+
.label-danger[href]:focus {
|
4608 |
+
background-color: #c9302c;
|
4609 |
+
}
|
4610 |
+
.badge {
|
4611 |
+
display: inline-block;
|
4612 |
+
min-width: 10px;
|
4613 |
+
padding: 3px 7px;
|
4614 |
+
font-size: 12px;
|
4615 |
+
font-weight: bold;
|
4616 |
+
line-height: 1;
|
4617 |
+
color: #fff;
|
4618 |
+
text-align: center;
|
4619 |
+
white-space: nowrap;
|
4620 |
+
vertical-align: baseline;
|
4621 |
+
background-color: #777;
|
4622 |
+
border-radius: 10px;
|
4623 |
+
}
|
4624 |
+
.badge:empty {
|
4625 |
+
display: none;
|
4626 |
+
}
|
4627 |
+
.btn .badge {
|
4628 |
+
position: relative;
|
4629 |
+
top: -1px;
|
4630 |
+
}
|
4631 |
+
.btn-xs .badge {
|
4632 |
+
top: 0;
|
4633 |
+
padding: 1px 5px;
|
4634 |
+
}
|
4635 |
+
a.badge:hover,
|
4636 |
+
a.badge:focus {
|
4637 |
+
color: #fff;
|
4638 |
+
text-decoration: none;
|
4639 |
+
cursor: pointer;
|
4640 |
+
}
|
4641 |
+
a.list-group-item.active > .badge,
|
4642 |
+
.nav-pills > .active > a > .badge {
|
4643 |
+
color: #428bca;
|
4644 |
+
background-color: #fff;
|
4645 |
+
}
|
4646 |
+
.nav-pills > li > a > .badge {
|
4647 |
+
margin-left: 3px;
|
4648 |
+
}
|
4649 |
+
.jumbotron {
|
4650 |
+
padding: 30px 15px;
|
4651 |
+
margin-bottom: 30px;
|
4652 |
+
color: inherit;
|
4653 |
+
background-color: #eee;
|
4654 |
+
}
|
4655 |
+
.jumbotron h1,
|
4656 |
+
.jumbotron .h1 {
|
4657 |
+
color: inherit;
|
4658 |
+
}
|
4659 |
+
.jumbotron p {
|
4660 |
+
margin-bottom: 15px;
|
4661 |
+
font-size: 21px;
|
4662 |
+
font-weight: 200;
|
4663 |
+
}
|
4664 |
+
.jumbotron > hr {
|
4665 |
+
border-top-color: #d5d5d5;
|
4666 |
+
}
|
4667 |
+
.container .jumbotron,
|
4668 |
+
.container-fluid .jumbotron {
|
4669 |
+
border-radius: 6px;
|
4670 |
+
}
|
4671 |
+
.jumbotron .container {
|
4672 |
+
max-width: 100%;
|
4673 |
+
}
|
4674 |
+
@media screen and (min-width: 768px) {
|
4675 |
+
.jumbotron {
|
4676 |
+
padding: 48px 0;
|
4677 |
+
}
|
4678 |
+
.container .jumbotron {
|
4679 |
+
padding-right: 60px;
|
4680 |
+
padding-left: 60px;
|
4681 |
+
}
|
4682 |
+
.jumbotron h1,
|
4683 |
+
.jumbotron .h1 {
|
4684 |
+
font-size: 63px;
|
4685 |
+
}
|
4686 |
+
}
|
4687 |
+
.thumbnail {
|
4688 |
+
display: block;
|
4689 |
+
padding: 4px;
|
4690 |
+
margin-bottom: 20px;
|
4691 |
+
line-height: 1.42857143;
|
4692 |
+
background-color: #fff;
|
4693 |
+
border: 1px solid #ddd;
|
4694 |
+
border-radius: 4px;
|
4695 |
+
-webkit-transition: border .2s ease-in-out;
|
4696 |
+
-o-transition: border .2s ease-in-out;
|
4697 |
+
transition: border .2s ease-in-out;
|
4698 |
+
}
|
4699 |
+
.thumbnail > img,
|
4700 |
+
.thumbnail a > img {
|
4701 |
+
margin-right: auto;
|
4702 |
+
margin-left: auto;
|
4703 |
+
}
|
4704 |
+
a.thumbnail:hover,
|
4705 |
+
a.thumbnail:focus,
|
4706 |
+
a.thumbnail.active {
|
4707 |
+
border-color: #428bca;
|
4708 |
+
}
|
4709 |
+
.thumbnail .caption {
|
4710 |
+
padding: 9px;
|
4711 |
+
color: #333;
|
4712 |
+
}
|
4713 |
+
.alert {
|
4714 |
+
padding: 15px;
|
4715 |
+
margin-bottom: 20px;
|
4716 |
+
border: 1px solid transparent;
|
4717 |
+
border-radius: 4px;
|
4718 |
+
}
|
4719 |
+
.alert h4 {
|
4720 |
+
margin-top: 0;
|
4721 |
+
color: inherit;
|
4722 |
+
}
|
4723 |
+
.alert .alert-link {
|
4724 |
+
font-weight: bold;
|
4725 |
+
}
|
4726 |
+
.alert > p,
|
4727 |
+
.alert > ul {
|
4728 |
+
margin-bottom: 0;
|
4729 |
+
}
|
4730 |
+
.alert > p + p {
|
4731 |
+
margin-top: 5px;
|
4732 |
+
}
|
4733 |
+
.alert-dismissable,
|
4734 |
+
.alert-dismissible {
|
4735 |
+
padding-right: 35px;
|
4736 |
+
}
|
4737 |
+
.alert-dismissable .close,
|
4738 |
+
.alert-dismissible .close {
|
4739 |
+
position: relative;
|
4740 |
+
top: -2px;
|
4741 |
+
right: -21px;
|
4742 |
+
color: inherit;
|
4743 |
+
}
|
4744 |
+
.alert-success {
|
4745 |
+
color: #3c763d;
|
4746 |
+
background-color: #dff0d8;
|
4747 |
+
border-color: #d6e9c6;
|
4748 |
+
}
|
4749 |
+
.alert-success hr {
|
4750 |
+
border-top-color: #c9e2b3;
|
4751 |
+
}
|
4752 |
+
.alert-success .alert-link {
|
4753 |
+
color: #2b542c;
|
4754 |
+
}
|
4755 |
+
.alert-info {
|
4756 |
+
color: #31708f;
|
4757 |
+
background-color: #d9edf7;
|
4758 |
+
border-color: #bce8f1;
|
4759 |
+
}
|
4760 |
+
.alert-info hr {
|
4761 |
+
border-top-color: #a6e1ec;
|
4762 |
+
}
|
4763 |
+
.alert-info .alert-link {
|
4764 |
+
color: #245269;
|
4765 |
+
}
|
4766 |
+
.alert-warning {
|
4767 |
+
color: #8a6d3b;
|
4768 |
+
background-color: #fcf8e3;
|
4769 |
+
border-color: #faebcc;
|
4770 |
+
}
|
4771 |
+
.alert-warning hr {
|
4772 |
+
border-top-color: #f7e1b5;
|
4773 |
+
}
|
4774 |
+
.alert-warning .alert-link {
|
4775 |
+
color: #66512c;
|
4776 |
+
}
|
4777 |
+
.alert-danger {
|
4778 |
+
color: #a94442;
|
4779 |
+
background-color: #f2dede;
|
4780 |
+
border-color: #ebccd1;
|
4781 |
+
}
|
4782 |
+
.alert-danger hr {
|
4783 |
+
border-top-color: #e4b9c0;
|
4784 |
+
}
|
4785 |
+
.alert-danger .alert-link {
|
4786 |
+
color: #843534;
|
4787 |
+
}
|
4788 |
+
@-webkit-keyframes progress-bar-stripes {
|
4789 |
+
from {
|
4790 |
+
background-position: 40px 0;
|
4791 |
+
}
|
4792 |
+
to {
|
4793 |
+
background-position: 0 0;
|
4794 |
+
}
|
4795 |
+
}
|
4796 |
+
@-o-keyframes progress-bar-stripes {
|
4797 |
+
from {
|
4798 |
+
background-position: 40px 0;
|
4799 |
+
}
|
4800 |
+
to {
|
4801 |
+
background-position: 0 0;
|
4802 |
+
}
|
4803 |
+
}
|
4804 |
+
@keyframes progress-bar-stripes {
|
4805 |
+
from {
|
4806 |
+
background-position: 40px 0;
|
4807 |
+
}
|
4808 |
+
to {
|
4809 |
+
background-position: 0 0;
|
4810 |
+
}
|
4811 |
+
}
|
4812 |
+
.progress {
|
4813 |
+
height: 20px;
|
4814 |
+
margin-bottom: 20px;
|
4815 |
+
overflow: hidden;
|
4816 |
+
background-color: #f5f5f5;
|
4817 |
+
border-radius: 4px;
|
4818 |
+
-webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);
|
4819 |
+
box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);
|
4820 |
+
}
|
4821 |
+
.progress-bar {
|
4822 |
+
float: left;
|
4823 |
+
width: 0;
|
4824 |
+
height: 100%;
|
4825 |
+
font-size: 12px;
|
4826 |
+
line-height: 20px;
|
4827 |
+
color: #fff;
|
4828 |
+
text-align: center;
|
4829 |
+
background-color: #428bca;
|
4830 |
+
-webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);
|
4831 |
+
box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);
|
4832 |
+
-webkit-transition: width .6s ease;
|
4833 |
+
-o-transition: width .6s ease;
|
4834 |
+
transition: width .6s ease;
|
4835 |
+
}
|
4836 |
+
.progress-striped .progress-bar,
|
4837 |
+
.progress-bar-striped {
|
4838 |
+
background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
|
4839 |
+
background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
|
4840 |
+
background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
|
4841 |
+
-webkit-background-size: 40px 40px;
|
4842 |
+
background-size: 40px 40px;
|
4843 |
+
}
|
4844 |
+
.progress.active .progress-bar,
|
4845 |
+
.progress-bar.active {
|
4846 |
+
-webkit-animation: progress-bar-stripes 2s linear infinite;
|
4847 |
+
-o-animation: progress-bar-stripes 2s linear infinite;
|
4848 |
+
animation: progress-bar-stripes 2s linear infinite;
|
4849 |
+
}
|
4850 |
+
.progress-bar-success {
|
4851 |
+
background-color: #5cb85c;
|
4852 |
+
}
|
4853 |
+
.progress-striped .progress-bar-success {
|
4854 |
+
background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
|
4855 |
+
background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
|
4856 |
+
background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
|
4857 |
+
}
|
4858 |
+
.progress-bar-info {
|
4859 |
+
background-color: #5bc0de;
|
4860 |
+
}
|
4861 |
+
.progress-striped .progress-bar-info {
|
4862 |
+
background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
|
4863 |
+
background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
|
4864 |
+
background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
|
4865 |
+
}
|
4866 |
+
.progress-bar-warning {
|
4867 |
+
background-color: #f0ad4e;
|
4868 |
+
}
|
4869 |
+
.progress-striped .progress-bar-warning {
|
4870 |
+
background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
|
4871 |
+
background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
|
4872 |
+
background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
|
4873 |
+
}
|
4874 |
+
.progress-bar-danger {
|
4875 |
+
background-color: #d9534f;
|
4876 |
+
}
|
4877 |
+
.progress-striped .progress-bar-danger {
|
4878 |
+
background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
|
4879 |
+
background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
|
4880 |
+
background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
|
4881 |
+
}
|
4882 |
+
.media {
|
4883 |
+
margin-top: 15px;
|
4884 |
+
}
|
4885 |
+
.media:first-child {
|
4886 |
+
margin-top: 0;
|
4887 |
+
}
|
4888 |
+
.media-right,
|
4889 |
+
.media > .pull-right {
|
4890 |
+
padding-left: 10px;
|
4891 |
+
}
|
4892 |
+
.media-left,
|
4893 |
+
.media > .pull-left {
|
4894 |
+
padding-right: 10px;
|
4895 |
+
}
|
4896 |
+
.media-left,
|
4897 |
+
.media-right,
|
4898 |
+
.media-body {
|
4899 |
+
display: table-cell;
|
4900 |
+
vertical-align: top;
|
4901 |
+
}
|
4902 |
+
.media-middle {
|
4903 |
+
vertical-align: middle;
|
4904 |
+
}
|
4905 |
+
.media-bottom {
|
4906 |
+
vertical-align: bottom;
|
4907 |
+
}
|
4908 |
+
.media-heading {
|
4909 |
+
margin-top: 0;
|
4910 |
+
margin-bottom: 5px;
|
4911 |
+
}
|
4912 |
+
.media-list {
|
4913 |
+
padding-left: 0;
|
4914 |
+
list-style: none;
|
4915 |
+
}
|
4916 |
+
.list-group {
|
4917 |
+
padding-left: 0;
|
4918 |
+
margin-bottom: 20px;
|
4919 |
+
}
|
4920 |
+
.list-group-item {
|
4921 |
+
position: relative;
|
4922 |
+
display: block;
|
4923 |
+
padding: 10px 15px;
|
4924 |
+
margin-bottom: -1px;
|
4925 |
+
background-color: #fff;
|
4926 |
+
border: 1px solid #ddd;
|
4927 |
+
}
|
4928 |
+
.list-group-item:first-child {
|
4929 |
+
border-top-left-radius: 4px;
|
4930 |
+
border-top-right-radius: 4px;
|
4931 |
+
}
|
4932 |
+
.list-group-item:last-child {
|
4933 |
+
margin-bottom: 0;
|
4934 |
+
border-bottom-right-radius: 4px;
|
4935 |
+
border-bottom-left-radius: 4px;
|
4936 |
+
}
|
4937 |
+
.list-group-item > .badge {
|
4938 |
+
float: right;
|
4939 |
+
}
|
4940 |
+
.list-group-item > .badge + .badge {
|
4941 |
+
margin-right: 5px;
|
4942 |
+
}
|
4943 |
+
a.list-group-item {
|
4944 |
+
color: #555;
|
4945 |
+
}
|
4946 |
+
a.list-group-item .list-group-item-heading {
|
4947 |
+
color: #333;
|
4948 |
+
}
|
4949 |
+
a.list-group-item:hover,
|
4950 |
+
a.list-group-item:focus {
|
4951 |
+
color: #555;
|
4952 |
+
text-decoration: none;
|
4953 |
+
background-color: #f5f5f5;
|
4954 |
+
}
|
4955 |
+
.list-group-item.disabled,
|
4956 |
+
.list-group-item.disabled:hover,
|
4957 |
+
.list-group-item.disabled:focus {
|
4958 |
+
color: #777;
|
4959 |
+
cursor: not-allowed;
|
4960 |
+
background-color: #eee;
|
4961 |
+
}
|
4962 |
+
.list-group-item.disabled .list-group-item-heading,
|
4963 |
+
.list-group-item.disabled:hover .list-group-item-heading,
|
4964 |
+
.list-group-item.disabled:focus .list-group-item-heading {
|
4965 |
+
color: inherit;
|
4966 |
+
}
|
4967 |
+
.list-group-item.disabled .list-group-item-text,
|
4968 |
+
.list-group-item.disabled:hover .list-group-item-text,
|
4969 |
+
.list-group-item.disabled:focus .list-group-item-text {
|
4970 |
+
color: #777;
|
4971 |
+
}
|
4972 |
+
.list-group-item.active,
|
4973 |
+
.list-group-item.active:hover,
|
4974 |
+
.list-group-item.active:focus {
|
4975 |
+
z-index: 2;
|
4976 |
+
color: #fff;
|
4977 |
+
background-color: #428bca;
|
4978 |
+
border-color: #428bca;
|
4979 |
+
}
|
4980 |
+
.list-group-item.active .list-group-item-heading,
|
4981 |
+
.list-group-item.active:hover .list-group-item-heading,
|
4982 |
+
.list-group-item.active:focus .list-group-item-heading,
|
4983 |
+
.list-group-item.active .list-group-item-heading > small,
|
4984 |
+
.list-group-item.active:hover .list-group-item-heading > small,
|
4985 |
+
.list-group-item.active:focus .list-group-item-heading > small,
|
4986 |
+
.list-group-item.active .list-group-item-heading > .small,
|
4987 |
+
.list-group-item.active:hover .list-group-item-heading > .small,
|
4988 |
+
.list-group-item.active:focus .list-group-item-heading > .small {
|
4989 |
+
color: inherit;
|
4990 |
+
}
|
4991 |
+
.list-group-item.active .list-group-item-text,
|
4992 |
+
.list-group-item.active:hover .list-group-item-text,
|
4993 |
+
.list-group-item.active:focus .list-group-item-text {
|
4994 |
+
color: #e1edf7;
|
4995 |
+
}
|
4996 |
+
.list-group-item-success {
|
4997 |
+
color: #3c763d;
|
4998 |
+
background-color: #dff0d8;
|
4999 |
+
}
|
5000 |
+
a.list-group-item-success {
|
5001 |
+
color: #3c763d;
|
5002 |
+
}
|
5003 |
+
a.list-group-item-success .list-group-item-heading {
|
5004 |
+
color: inherit;
|
5005 |
+
}
|
5006 |
+
a.list-group-item-success:hover,
|
5007 |
+
a.list-group-item-success:focus {
|
5008 |
+
color: #3c763d;
|
5009 |
+
background-color: #d0e9c6;
|
5010 |
+
}
|
5011 |
+
a.list-group-item-success.active,
|
5012 |
+
a.list-group-item-success.active:hover,
|
5013 |
+
a.list-group-item-success.active:focus {
|
5014 |
+
color: #fff;
|
5015 |
+
background-color: #3c763d;
|
5016 |
+
border-color: #3c763d;
|
5017 |
+
}
|
5018 |
+
.list-group-item-info {
|
5019 |
+
color: #31708f;
|
5020 |
+
background-color: #d9edf7;
|
5021 |
+
}
|
5022 |
+
a.list-group-item-info {
|
5023 |
+
color: #31708f;
|
5024 |
+
}
|
5025 |
+
a.list-group-item-info .list-group-item-heading {
|
5026 |
+
color: inherit;
|
5027 |
+
}
|
5028 |
+
a.list-group-item-info:hover,
|
5029 |
+
a.list-group-item-info:focus {
|
5030 |
+
color: #31708f;
|
5031 |
+
background-color: #c4e3f3;
|
5032 |
+
}
|
5033 |
+
a.list-group-item-info.active,
|
5034 |
+
a.list-group-item-info.active:hover,
|
5035 |
+
a.list-group-item-info.active:focus {
|
5036 |
+
color: #fff;
|
5037 |
+
background-color: #31708f;
|
5038 |
+
border-color: #31708f;
|
5039 |
+
}
|
5040 |
+
.list-group-item-warning {
|
5041 |
+
color: #8a6d3b;
|
5042 |
+
background-color: #fcf8e3;
|
5043 |
+
}
|
5044 |
+
a.list-group-item-warning {
|
5045 |
+
color: #8a6d3b;
|
5046 |
+
}
|
5047 |
+
a.list-group-item-warning .list-group-item-heading {
|
5048 |
+
color: inherit;
|
5049 |
+
}
|
5050 |
+
a.list-group-item-warning:hover,
|
5051 |
+
a.list-group-item-warning:focus {
|
5052 |
+
color: #8a6d3b;
|
5053 |
+
background-color: #faf2cc;
|
5054 |
+
}
|
5055 |
+
a.list-group-item-warning.active,
|
5056 |
+
a.list-group-item-warning.active:hover,
|
5057 |
+
a.list-group-item-warning.active:focus {
|
5058 |
+
color: #fff;
|
5059 |
+
background-color: #8a6d3b;
|
5060 |
+
border-color: #8a6d3b;
|
5061 |
+
}
|
5062 |
+
.list-group-item-danger {
|
5063 |
+
color: #a94442;
|
5064 |
+
background-color: #f2dede;
|
5065 |
+
}
|
5066 |
+
a.list-group-item-danger {
|
5067 |
+
color: #a94442;
|
5068 |
+
}
|
5069 |
+
a.list-group-item-danger .list-group-item-heading {
|
5070 |
+
color: inherit;
|
5071 |
+
}
|
5072 |
+
a.list-group-item-danger:hover,
|
5073 |
+
a.list-group-item-danger:focus {
|
5074 |
+
color: #a94442;
|
5075 |
+
background-color: #ebcccc;
|
5076 |
+
}
|
5077 |
+
a.list-group-item-danger.active,
|
5078 |
+
a.list-group-item-danger.active:hover,
|
5079 |
+
a.list-group-item-danger.active:focus {
|
5080 |
+
color: #fff;
|
5081 |
+
background-color: #a94442;
|
5082 |
+
border-color: #a94442;
|
5083 |
+
}
|
5084 |
+
.list-group-item-heading {
|
5085 |
+
margin-top: 0;
|
5086 |
+
margin-bottom: 5px;
|
5087 |
+
}
|
5088 |
+
.list-group-item-text {
|
5089 |
+
margin-bottom: 0;
|
5090 |
+
line-height: 1.3;
|
5091 |
+
}
|
5092 |
+
.panel {
|
5093 |
+
margin-bottom: 20px;
|
5094 |
+
background-color: #fff;
|
5095 |
+
border: 1px solid transparent;
|
5096 |
+
border-radius: 4px;
|
5097 |
+
-webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05);
|
5098 |
+
box-shadow: 0 1px 1px rgba(0, 0, 0, .05);
|
5099 |
+
}
|
5100 |
+
.panel-body {
|
5101 |
+
padding: 15px;
|
5102 |
+
}
|
5103 |
+
.panel-heading {
|
5104 |
+
padding: 10px 15px;
|
5105 |
+
border-bottom: 1px solid transparent;
|
5106 |
+
border-top-left-radius: 3px;
|
5107 |
+
border-top-right-radius: 3px;
|
5108 |
+
}
|
5109 |
+
.panel-heading > .dropdown .dropdown-toggle {
|
5110 |
+
color: inherit;
|
5111 |
+
}
|
5112 |
+
.panel-title {
|
5113 |
+
margin-top: 0;
|
5114 |
+
margin-bottom: 0;
|
5115 |
+
font-size: 16px;
|
5116 |
+
color: inherit;
|
5117 |
+
}
|
5118 |
+
.panel-title > a {
|
5119 |
+
color: inherit;
|
5120 |
+
}
|
5121 |
+
.panel-footer {
|
5122 |
+
padding: 10px 15px;
|
5123 |
+
background-color: #f5f5f5;
|
5124 |
+
border-top: 1px solid #ddd;
|
5125 |
+
border-bottom-right-radius: 3px;
|
5126 |
+
border-bottom-left-radius: 3px;
|
5127 |
+
}
|
5128 |
+
.panel > .list-group,
|
5129 |
+
.panel > .panel-collapse > .list-group {
|
5130 |
+
margin-bottom: 0;
|
5131 |
+
}
|
5132 |
+
.panel > .list-group .list-group-item,
|
5133 |
+
.panel > .panel-collapse > .list-group .list-group-item {
|
5134 |
+
border-width: 1px 0;
|
5135 |
+
border-radius: 0;
|
5136 |
+
}
|
5137 |
+
.panel > .list-group:first-child .list-group-item:first-child,
|
5138 |
+
.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {
|
5139 |
+
border-top: 0;
|
5140 |
+
border-top-left-radius: 3px;
|
5141 |
+
border-top-right-radius: 3px;
|
5142 |
+
}
|
5143 |
+
.panel > .list-group:last-child .list-group-item:last-child,
|
5144 |
+
.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {
|
5145 |
+
border-bottom: 0;
|
5146 |
+
border-bottom-right-radius: 3px;
|
5147 |
+
border-bottom-left-radius: 3px;
|
5148 |
+
}
|
5149 |
+
.panel-heading + .list-group .list-group-item:first-child {
|
5150 |
+
border-top-width: 0;
|
5151 |
+
}
|
5152 |
+
.list-group + .panel-footer {
|
5153 |
+
border-top-width: 0;
|
5154 |
+
}
|
5155 |
+
.panel > .table,
|
5156 |
+
.panel > .table-responsive > .table,
|
5157 |
+
.panel > .panel-collapse > .table {
|
5158 |
+
margin-bottom: 0;
|
5159 |
+
}
|
5160 |
+
.panel > .table caption,
|
5161 |
+
.panel > .table-responsive > .table caption,
|
5162 |
+
.panel > .panel-collapse > .table caption {
|
5163 |
+
padding-right: 15px;
|
5164 |
+
padding-left: 15px;
|
5165 |
+
}
|
5166 |
+
.panel > .table:first-child,
|
5167 |
+
.panel > .table-responsive:first-child > .table:first-child {
|
5168 |
+
border-top-left-radius: 3px;
|
5169 |
+
border-top-right-radius: 3px;
|
5170 |
+
}
|
5171 |
+
.panel > .table:first-child > thead:first-child > tr:first-child,
|
5172 |
+
.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,
|
5173 |
+
.panel > .table:first-child > tbody:first-child > tr:first-child,
|
5174 |
+
.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {
|
5175 |
+
border-top-left-radius: 3px;
|
5176 |
+
border-top-right-radius: 3px;
|
5177 |
+
}
|
5178 |
+
.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,
|
5179 |
+
.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,
|
5180 |
+
.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,
|
5181 |
+
.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,
|
5182 |
+
.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,
|
5183 |
+
.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,
|
5184 |
+
.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,
|
5185 |
+
.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {
|
5186 |
+
border-top-left-radius: 3px;
|
5187 |
+
}
|
5188 |
+
.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,
|
5189 |
+
.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,
|
5190 |
+
.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,
|
5191 |
+
.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,
|
5192 |
+
.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,
|
5193 |
+
.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,
|
5194 |
+
.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,
|
5195 |
+
.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {
|
5196 |
+
border-top-right-radius: 3px;
|
5197 |
+
}
|
5198 |
+
.panel > .table:last-child,
|
5199 |
+
.panel > .table-responsive:last-child > .table:last-child {
|
5200 |
+
border-bottom-right-radius: 3px;
|
5201 |
+
border-bottom-left-radius: 3px;
|
5202 |
+
}
|
5203 |
+
.panel > .table:last-child > tbody:last-child > tr:last-child,
|
5204 |
+
.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,
|
5205 |
+
.panel > .table:last-child > tfoot:last-child > tr:last-child,
|
5206 |
+
.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {
|
5207 |
+
border-bottom-right-radius: 3px;
|
5208 |
+
border-bottom-left-radius: 3px;
|
5209 |
+
}
|
5210 |
+
.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,
|
5211 |
+
.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,
|
5212 |
+
.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
|
5213 |
+
.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
|
5214 |
+
.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,
|
5215 |
+
.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,
|
5216 |
+
.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,
|
5217 |
+
.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {
|
5218 |
+
border-bottom-left-radius: 3px;
|
5219 |
+
}
|
5220 |
+
.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,
|
5221 |
+
.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,
|
5222 |
+
.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
|
5223 |
+
.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
|
5224 |
+
.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,
|
5225 |
+
.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,
|
5226 |
+
.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,
|
5227 |
+
.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {
|
5228 |
+
border-bottom-right-radius: 3px;
|
5229 |
+
}
|
5230 |
+
.panel > .panel-body + .table,
|
5231 |
+
.panel > .panel-body + .table-responsive,
|
5232 |
+
.panel > .table + .panel-body,
|
5233 |
+
.panel > .table-responsive + .panel-body {
|
5234 |
+
border-top: 1px solid #ddd;
|
5235 |
+
}
|
5236 |
+
.panel > .table > tbody:first-child > tr:first-child th,
|
5237 |
+
.panel > .table > tbody:first-child > tr:first-child td {
|
5238 |
+
border-top: 0;
|
5239 |
+
}
|
5240 |
+
.panel > .table-bordered,
|
5241 |
+
.panel > .table-responsive > .table-bordered {
|
5242 |
+
border: 0;
|
5243 |
+
}
|
5244 |
+
.panel > .table-bordered > thead > tr > th:first-child,
|
5245 |
+
.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,
|
5246 |
+
.panel > .table-bordered > tbody > tr > th:first-child,
|
5247 |
+
.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,
|
5248 |
+
.panel > .table-bordered > tfoot > tr > th:first-child,
|
5249 |
+
.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,
|
5250 |
+
.panel > .table-bordered > thead > tr > td:first-child,
|
5251 |
+
.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,
|
5252 |
+
.panel > .table-bordered > tbody > tr > td:first-child,
|
5253 |
+
.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,
|
5254 |
+
.panel > .table-bordered > tfoot > tr > td:first-child,
|
5255 |
+
.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {
|
5256 |
+
border-left: 0;
|
5257 |
+
}
|
5258 |
+
.panel > .table-bordered > thead > tr > th:last-child,
|
5259 |
+
.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,
|
5260 |
+
.panel > .table-bordered > tbody > tr > th:last-child,
|
5261 |
+
.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,
|
5262 |
+
.panel > .table-bordered > tfoot > tr > th:last-child,
|
5263 |
+
.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,
|
5264 |
+
.panel > .table-bordered > thead > tr > td:last-child,
|
5265 |
+
.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,
|
5266 |
+
.panel > .table-bordered > tbody > tr > td:last-child,
|
5267 |
+
.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,
|
5268 |
+
.panel > .table-bordered > tfoot > tr > td:last-child,
|
5269 |
+
.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {
|
5270 |
+
border-right: 0;
|
5271 |
+
}
|
5272 |
+
.panel > .table-bordered > thead > tr:first-child > td,
|
5273 |
+
.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,
|
5274 |
+
.panel > .table-bordered > tbody > tr:first-child > td,
|
5275 |
+
.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,
|
5276 |
+
.panel > .table-bordered > thead > tr:first-child > th,
|
5277 |
+
.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,
|
5278 |
+
.panel > .table-bordered > tbody > tr:first-child > th,
|
5279 |
+
.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {
|
5280 |
+
border-bottom: 0;
|
5281 |
+
}
|
5282 |
+
.panel > .table-bordered > tbody > tr:last-child > td,
|
5283 |
+
.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,
|
5284 |
+
.panel > .table-bordered > tfoot > tr:last-child > td,
|
5285 |
+
.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,
|
5286 |
+
.panel > .table-bordered > tbody > tr:last-child > th,
|
5287 |
+
.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,
|
5288 |
+
.panel > .table-bordered > tfoot > tr:last-child > th,
|
5289 |
+
.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {
|
5290 |
+
border-bottom: 0;
|
5291 |
+
}
|
5292 |
+
.panel > .table-responsive {
|
5293 |
+
margin-bottom: 0;
|
5294 |
+
border: 0;
|
5295 |
+
}
|
5296 |
+
.panel-group {
|
5297 |
+
margin-bottom: 20px;
|
5298 |
+
}
|
5299 |
+
.panel-group .panel {
|
5300 |
+
margin-bottom: 0;
|
5301 |
+
border-radius: 4px;
|
5302 |
+
}
|
5303 |
+
.panel-group .panel + .panel {
|
5304 |
+
margin-top: 5px;
|
5305 |
+
}
|
5306 |
+
.panel-group .panel-heading {
|
5307 |
+
border-bottom: 0;
|
5308 |
+
}
|
5309 |
+
.panel-group .panel-heading + .panel-collapse > .panel-body,
|
5310 |
+
.panel-group .panel-heading + .panel-collapse > .list-group {
|
5311 |
+
border-top: 1px solid #ddd;
|
5312 |
+
}
|
5313 |
+
.panel-group .panel-footer {
|
5314 |
+
border-top: 0;
|
5315 |
+
}
|
5316 |
+
.panel-group .panel-footer + .panel-collapse .panel-body {
|
5317 |
+
border-bottom: 1px solid #ddd;
|
5318 |
+
}
|
5319 |
+
.panel-default {
|
5320 |
+
border-color: #ddd;
|
5321 |
+
}
|
5322 |
+
.panel-default > .panel-heading {
|
5323 |
+
color: #333;
|
5324 |
+
background-color: #f5f5f5;
|
5325 |
+
border-color: #ddd;
|
5326 |
+
}
|
5327 |
+
.panel-default > .panel-heading + .panel-collapse > .panel-body {
|
5328 |
+
border-top-color: #ddd;
|
5329 |
+
}
|
5330 |
+
.panel-default > .panel-heading .badge {
|
5331 |
+
color: #f5f5f5;
|
5332 |
+
background-color: #333;
|
5333 |
+
}
|
5334 |
+
.panel-default > .panel-footer + .panel-collapse > .panel-body {
|
5335 |
+
border-bottom-color: #ddd;
|
5336 |
+
}
|
5337 |
+
.panel-primary {
|
5338 |
+
border-color: #428bca;
|
5339 |
+
}
|
5340 |
+
.panel-primary > .panel-heading {
|
5341 |
+
color: #fff;
|
5342 |
+
background-color: #428bca;
|
5343 |
+
border-color: #428bca;
|
5344 |
+
}
|
5345 |
+
.panel-primary > .panel-heading + .panel-collapse > .panel-body {
|
5346 |
+
border-top-color: #428bca;
|
5347 |
+
}
|
5348 |
+
.panel-primary > .panel-heading .badge {
|
5349 |
+
color: #428bca;
|
5350 |
+
background-color: #fff;
|
5351 |
+
}
|
5352 |
+
.panel-primary > .panel-footer + .panel-collapse > .panel-body {
|
5353 |
+
border-bottom-color: #428bca;
|
5354 |
+
}
|
5355 |
+
.panel-success {
|
5356 |
+
border-color: #d6e9c6;
|
5357 |
+
}
|
5358 |
+
.panel-success > .panel-heading {
|
5359 |
+
color: #3c763d;
|
5360 |
+
background-color: #dff0d8;
|
5361 |
+
border-color: #d6e9c6;
|
5362 |
+
}
|
5363 |
+
.panel-success > .panel-heading + .panel-collapse > .panel-body {
|
5364 |
+
border-top-color: #d6e9c6;
|
5365 |
+
}
|
5366 |
+
.panel-success > .panel-heading .badge {
|
5367 |
+
color: #dff0d8;
|
5368 |
+
background-color: #3c763d;
|
5369 |
+
}
|
5370 |
+
.panel-success > .panel-footer + .panel-collapse > .panel-body {
|
5371 |
+
border-bottom-color: #d6e9c6;
|
5372 |
+
}
|
5373 |
+
.panel-info {
|
5374 |
+
border-color: #bce8f1;
|
5375 |
+
}
|
5376 |
+
.panel-info > .panel-heading {
|
5377 |
+
color: #31708f;
|
5378 |
+
background-color: #d9edf7;
|
5379 |
+
border-color: #bce8f1;
|
5380 |
+
}
|
5381 |
+
.panel-info > .panel-heading + .panel-collapse > .panel-body {
|
5382 |
+
border-top-color: #bce8f1;
|
5383 |
+
}
|
5384 |
+
.panel-info > .panel-heading .badge {
|
5385 |
+
color: #d9edf7;
|
5386 |
+
background-color: #31708f;
|
5387 |
+
}
|
5388 |
+
.panel-info > .panel-footer + .panel-collapse > .panel-body {
|
5389 |
+
border-bottom-color: #bce8f1;
|
5390 |
+
}
|
5391 |
+
.panel-warning {
|
5392 |
+
border-color: #faebcc;
|
5393 |
+
}
|
5394 |
+
.panel-warning > .panel-heading {
|
5395 |
+
color: #8a6d3b;
|
5396 |
+
background-color: #fcf8e3;
|
5397 |
+
border-color: #faebcc;
|
5398 |
+
}
|
5399 |
+
.panel-warning > .panel-heading + .panel-collapse > .panel-body {
|
5400 |
+
border-top-color: #faebcc;
|
5401 |
+
}
|
5402 |
+
.panel-warning > .panel-heading .badge {
|
5403 |
+
color: #fcf8e3;
|
5404 |
+
background-color: #8a6d3b;
|
5405 |
+
}
|
5406 |
+
.panel-warning > .panel-footer + .panel-collapse > .panel-body {
|
5407 |
+
border-bottom-color: #faebcc;
|
5408 |
+
}
|
5409 |
+
.panel-danger {
|
5410 |
+
border-color: #ebccd1;
|
5411 |
+
}
|
5412 |
+
.panel-danger > .panel-heading {
|
5413 |
+
color: #a94442;
|
5414 |
+
background-color: #f2dede;
|
5415 |
+
border-color: #ebccd1;
|
5416 |
+
}
|
5417 |
+
.panel-danger > .panel-heading + .panel-collapse > .panel-body {
|
5418 |
+
border-top-color: #ebccd1;
|
5419 |
+
}
|
5420 |
+
.panel-danger > .panel-heading .badge {
|
5421 |
+
color: #f2dede;
|
5422 |
+
background-color: #a94442;
|
5423 |
+
}
|
5424 |
+
.panel-danger > .panel-footer + .panel-collapse > .panel-body {
|
5425 |
+
border-bottom-color: #ebccd1;
|
5426 |
+
}
|
5427 |
+
.embed-responsive {
|
5428 |
+
position: relative;
|
5429 |
+
display: block;
|
5430 |
+
height: 0;
|
5431 |
+
padding: 0;
|
5432 |
+
overflow: hidden;
|
5433 |
+
}
|
5434 |
+
.embed-responsive .embed-responsive-item,
|
5435 |
+
.embed-responsive iframe,
|
5436 |
+
.embed-responsive embed,
|
5437 |
+
.embed-responsive object,
|
5438 |
+
.embed-responsive video {
|
5439 |
+
position: absolute;
|
5440 |
+
top: 0;
|
5441 |
+
bottom: 0;
|
5442 |
+
left: 0;
|
5443 |
+
width: 100%;
|
5444 |
+
height: 100%;
|
5445 |
+
border: 0;
|
5446 |
+
}
|
5447 |
+
.embed-responsive.embed-responsive-16by9 {
|
5448 |
+
padding-bottom: 56.25%;
|
5449 |
+
}
|
5450 |
+
.embed-responsive.embed-responsive-4by3 {
|
5451 |
+
padding-bottom: 75%;
|
5452 |
+
}
|
5453 |
+
.well {
|
5454 |
+
min-height: 20px;
|
5455 |
+
padding: 19px;
|
5456 |
+
margin-bottom: 20px;
|
5457 |
+
background-color: #f5f5f5;
|
5458 |
+
border: 1px solid #e3e3e3;
|
5459 |
+
border-radius: 4px;
|
5460 |
+
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);
|
5461 |
+
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);
|
5462 |
+
}
|
5463 |
+
.well blockquote {
|
5464 |
+
border-color: #ddd;
|
5465 |
+
border-color: rgba(0, 0, 0, .15);
|
5466 |
+
}
|
5467 |
+
.well-lg {
|
5468 |
+
padding: 24px;
|
5469 |
+
border-radius: 6px;
|
5470 |
+
}
|
5471 |
+
.well-sm {
|
5472 |
+
padding: 9px;
|
5473 |
+
border-radius: 3px;
|
5474 |
+
}
|
5475 |
+
.close {
|
5476 |
+
float: right;
|
5477 |
+
font-size: 21px;
|
5478 |
+
font-weight: bold;
|
5479 |
+
line-height: 1;
|
5480 |
+
color: #000;
|
5481 |
+
text-shadow: 0 1px 0 #fff;
|
5482 |
+
filter: alpha(opacity=20);
|
5483 |
+
opacity: .2;
|
5484 |
+
}
|
5485 |
+
.close:hover,
|
5486 |
+
.close:focus {
|
5487 |
+
color: #000;
|
5488 |
+
text-decoration: none;
|
5489 |
+
cursor: pointer;
|
5490 |
+
filter: alpha(opacity=50);
|
5491 |
+
opacity: .5;
|
5492 |
+
}
|
5493 |
+
button.close {
|
5494 |
+
-webkit-appearance: none;
|
5495 |
+
padding: 0;
|
5496 |
+
cursor: pointer;
|
5497 |
+
background: transparent;
|
5498 |
+
border: 0;
|
5499 |
+
}
|
5500 |
+
.modal-open {
|
5501 |
+
overflow: hidden;
|
5502 |
+
}
|
5503 |
+
.modal {
|
5504 |
+
position: fixed;
|
5505 |
+
top: 0;
|
5506 |
+
right: 0;
|
5507 |
+
bottom: 0;
|
5508 |
+
left: 0;
|
5509 |
+
z-index: 1040;
|
5510 |
+
display: none;
|
5511 |
+
overflow: hidden;
|
5512 |
+
-webkit-overflow-scrolling: touch;
|
5513 |
+
outline: 0;
|
5514 |
+
}
|
5515 |
+
.modal.fade .modal-dialog {
|
5516 |
+
-webkit-transition: -webkit-transform .3s ease-out;
|
5517 |
+
-o-transition: -o-transform .3s ease-out;
|
5518 |
+
transition: transform .3s ease-out;
|
5519 |
+
-webkit-transform: translate(0, -25%);
|
5520 |
+
-ms-transform: translate(0, -25%);
|
5521 |
+
-o-transform: translate(0, -25%);
|
5522 |
+
transform: translate(0, -25%);
|
5523 |
+
}
|
5524 |
+
.modal.in .modal-dialog {
|
5525 |
+
-webkit-transform: translate(0, 0);
|
5526 |
+
-ms-transform: translate(0, 0);
|
5527 |
+
-o-transform: translate(0, 0);
|
5528 |
+
transform: translate(0, 0);
|
5529 |
+
}
|
5530 |
+
.modal-open .modal {
|
5531 |
+
overflow-x: hidden;
|
5532 |
+
overflow-y: auto;
|
5533 |
+
}
|
5534 |
+
.modal-dialog {
|
5535 |
+
position: relative;
|
5536 |
+
width: auto;
|
5537 |
+
margin: 10px;
|
5538 |
+
}
|
5539 |
+
.modal-content {
|
5540 |
+
position: relative;
|
5541 |
+
background-color: #fff;
|
5542 |
+
-webkit-background-clip: padding-box;
|
5543 |
+
background-clip: padding-box;
|
5544 |
+
border: 1px solid #999;
|
5545 |
+
border: 1px solid rgba(0, 0, 0, .2);
|
5546 |
+
border-radius: 6px;
|
5547 |
+
outline: 0;
|
5548 |
+
-webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
|
5549 |
+
box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
|
5550 |
+
}
|
5551 |
+
.modal-backdrop {
|
5552 |
+
position: fixed;
|
5553 |
+
top: 0;
|
5554 |
+
right: 0;
|
5555 |
+
bottom: 0;
|
5556 |
+
left: 0;
|
5557 |
+
background-color: #000;
|
5558 |
+
}
|
5559 |
+
.modal-backdrop.fade {
|
5560 |
+
filter: alpha(opacity=0);
|
5561 |
+
opacity: 0;
|
5562 |
+
}
|
5563 |
+
.modal-backdrop.in {
|
5564 |
+
filter: alpha(opacity=50);
|
5565 |
+
opacity: .5;
|
5566 |
+
}
|
5567 |
+
.modal-header {
|
5568 |
+
min-height: 16.42857143px;
|
5569 |
+
padding: 15px;
|
5570 |
+
border-bottom: 1px solid #e5e5e5;
|
5571 |
+
}
|
5572 |
+
.modal-header .close {
|
5573 |
+
margin-top: -2px;
|
5574 |
+
}
|
5575 |
+
.modal-title {
|
5576 |
+
margin: 0;
|
5577 |
+
line-height: 1.42857143;
|
5578 |
+
}
|
5579 |
+
.modal-body {
|
5580 |
+
position: relative;
|
5581 |
+
padding: 15px;
|
5582 |
+
}
|
5583 |
+
.modal-footer {
|
5584 |
+
padding: 15px;
|
5585 |
+
text-align: right;
|
5586 |
+
border-top: 1px solid #e5e5e5;
|
5587 |
+
}
|
5588 |
+
.modal-footer .btn + .btn {
|
5589 |
+
margin-bottom: 0;
|
5590 |
+
margin-left: 5px;
|
5591 |
+
}
|
5592 |
+
.modal-footer .btn-group .btn + .btn {
|
5593 |
+
margin-left: -1px;
|
5594 |
+
}
|
5595 |
+
.modal-footer .btn-block + .btn-block {
|
5596 |
+
margin-left: 0;
|
5597 |
+
}
|
5598 |
+
.modal-scrollbar-measure {
|
5599 |
+
position: absolute;
|
5600 |
+
top: -9999px;
|
5601 |
+
width: 50px;
|
5602 |
+
height: 50px;
|
5603 |
+
overflow: scroll;
|
5604 |
+
}
|
5605 |
+
@media (min-width: 768px) {
|
5606 |
+
.modal-dialog {
|
5607 |
+
width: 600px;
|
5608 |
+
margin: 30px auto;
|
5609 |
+
}
|
5610 |
+
.modal-content {
|
5611 |
+
-webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
|
5612 |
+
box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
|
5613 |
+
}
|
5614 |
+
.modal-sm {
|
5615 |
+
width: 300px;
|
5616 |
+
}
|
5617 |
+
}
|
5618 |
+
@media (min-width: 992px) {
|
5619 |
+
.modal-lg {
|
5620 |
+
width: 900px;
|
5621 |
+
}
|
5622 |
+
}
|
5623 |
+
.tooltip {
|
5624 |
+
position: absolute;
|
5625 |
+
z-index: 1070;
|
5626 |
+
display: block;
|
5627 |
+
font-size: 12px;
|
5628 |
+
line-height: 1.4;
|
5629 |
+
visibility: visible;
|
5630 |
+
filter: alpha(opacity=0);
|
5631 |
+
opacity: 0;
|
5632 |
+
}
|
5633 |
+
.tooltip.in {
|
5634 |
+
filter: alpha(opacity=90);
|
5635 |
+
opacity: .9;
|
5636 |
+
}
|
5637 |
+
.tooltip.top {
|
5638 |
+
padding: 5px 0;
|
5639 |
+
margin-top: -3px;
|
5640 |
+
}
|
5641 |
+
.tooltip.right {
|
5642 |
+
padding: 0 5px;
|
5643 |
+
margin-left: 3px;
|
5644 |
+
}
|
5645 |
+
.tooltip.bottom {
|
5646 |
+
padding: 5px 0;
|
5647 |
+
margin-top: 3px;
|
5648 |
+
}
|
5649 |
+
.tooltip.left {
|
5650 |
+
padding: 0 5px;
|
5651 |
+
margin-left: -3px;
|
5652 |
+
}
|
5653 |
+
.tooltip-inner {
|
5654 |
+
max-width: 200px;
|
5655 |
+
padding: 3px 8px;
|
5656 |
+
color: #fff;
|
5657 |
+
text-align: center;
|
5658 |
+
text-decoration: none;
|
5659 |
+
background-color: #000;
|
5660 |
+
border-radius: 4px;
|
5661 |
+
}
|
5662 |
+
.tooltip-arrow {
|
5663 |
+
position: absolute;
|
5664 |
+
width: 0;
|
5665 |
+
height: 0;
|
5666 |
+
border-color: transparent;
|
5667 |
+
border-style: solid;
|
5668 |
+
}
|
5669 |
+
.tooltip.top .tooltip-arrow {
|
5670 |
+
bottom: 0;
|
5671 |
+
left: 50%;
|
5672 |
+
margin-left: -5px;
|
5673 |
+
border-width: 5px 5px 0;
|
5674 |
+
border-top-color: #000;
|
5675 |
+
}
|
5676 |
+
.tooltip.top-left .tooltip-arrow {
|
5677 |
+
bottom: 0;
|
5678 |
+
left: 5px;
|
5679 |
+
border-width: 5px 5px 0;
|
5680 |
+
border-top-color: #000;
|
5681 |
+
}
|
5682 |
+
.tooltip.top-right .tooltip-arrow {
|
5683 |
+
right: 5px;
|
5684 |
+
bottom: 0;
|
5685 |
+
border-width: 5px 5px 0;
|
5686 |
+
border-top-color: #000;
|
5687 |
+
}
|
5688 |
+
.tooltip.right .tooltip-arrow {
|
5689 |
+
top: 50%;
|
5690 |
+
left: 0;
|
5691 |
+
margin-top: -5px;
|
5692 |
+
border-width: 5px 5px 5px 0;
|
5693 |
+
border-right-color: #000;
|
5694 |
+
}
|
5695 |
+
.tooltip.left .tooltip-arrow {
|
5696 |
+
top: 50%;
|
5697 |
+
right: 0;
|
5698 |
+
margin-top: -5px;
|
5699 |
+
border-width: 5px 0 5px 5px;
|
5700 |
+
border-left-color: #000;
|
5701 |
+
}
|
5702 |
+
.tooltip.bottom .tooltip-arrow {
|
5703 |
+
top: 0;
|
5704 |
+
left: 50%;
|
5705 |
+
margin-left: -5px;
|
5706 |
+
border-width: 0 5px 5px;
|
5707 |
+
border-bottom-color: #000;
|
5708 |
+
}
|
5709 |
+
.tooltip.bottom-left .tooltip-arrow {
|
5710 |
+
top: 0;
|
5711 |
+
left: 5px;
|
5712 |
+
border-width: 0 5px 5px;
|
5713 |
+
border-bottom-color: #000;
|
5714 |
+
}
|
5715 |
+
.tooltip.bottom-right .tooltip-arrow {
|
5716 |
+
top: 0;
|
5717 |
+
right: 5px;
|
5718 |
+
border-width: 0 5px 5px;
|
5719 |
+
border-bottom-color: #000;
|
5720 |
+
}
|
5721 |
+
.popover {
|
5722 |
+
position: absolute;
|
5723 |
+
top: 0;
|
5724 |
+
left: 0;
|
5725 |
+
z-index: 1060;
|
5726 |
+
display: none;
|
5727 |
+
max-width: 276px;
|
5728 |
+
padding: 1px;
|
5729 |
+
font-size: 14px;
|
5730 |
+
font-weight: normal;
|
5731 |
+
line-height: 1.42857143;
|
5732 |
+
text-align: left;
|
5733 |
+
white-space: normal;
|
5734 |
+
background-color: #fff;
|
5735 |
+
-webkit-background-clip: padding-box;
|
5736 |
+
background-clip: padding-box;
|
5737 |
+
border: 1px solid #ccc;
|
5738 |
+
border: 1px solid rgba(0, 0, 0, .2);
|
5739 |
+
border-radius: 6px;
|
5740 |
+
-webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
|
5741 |
+
box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
|
5742 |
+
}
|
5743 |
+
.popover.top {
|
5744 |
+
margin-top: -10px;
|
5745 |
+
}
|
5746 |
+
.popover.right {
|
5747 |
+
margin-left: 10px;
|
5748 |
+
}
|
5749 |
+
.popover.bottom {
|
5750 |
+
margin-top: 10px;
|
5751 |
+
}
|
5752 |
+
.popover.left {
|
5753 |
+
margin-left: -10px;
|
5754 |
+
}
|
5755 |
+
.popover-title {
|
5756 |
+
padding: 8px 14px;
|
5757 |
+
margin: 0;
|
5758 |
+
font-size: 14px;
|
5759 |
+
background-color: #f7f7f7;
|
5760 |
+
border-bottom: 1px solid #ebebeb;
|
5761 |
+
border-radius: 5px 5px 0 0;
|
5762 |
+
}
|
5763 |
+
.popover-content {
|
5764 |
+
padding: 9px 14px;
|
5765 |
+
}
|
5766 |
+
.popover > .arrow,
|
5767 |
+
.popover > .arrow:after {
|
5768 |
+
position: absolute;
|
5769 |
+
display: block;
|
5770 |
+
width: 0;
|
5771 |
+
height: 0;
|
5772 |
+
border-color: transparent;
|
5773 |
+
border-style: solid;
|
5774 |
+
}
|
5775 |
+
.popover > .arrow {
|
5776 |
+
border-width: 11px;
|
5777 |
+
}
|
5778 |
+
.popover > .arrow:after {
|
5779 |
+
content: "";
|
5780 |
+
border-width: 10px;
|
5781 |
+
}
|
5782 |
+
.popover.top > .arrow {
|
5783 |
+
bottom: -11px;
|
5784 |
+
left: 50%;
|
5785 |
+
margin-left: -11px;
|
5786 |
+
border-top-color: #999;
|
5787 |
+
border-top-color: rgba(0, 0, 0, .25);
|
5788 |
+
border-bottom-width: 0;
|
5789 |
+
}
|
5790 |
+
.popover.top > .arrow:after {
|
5791 |
+
bottom: 1px;
|
5792 |
+
margin-left: -10px;
|
5793 |
+
content: " ";
|
5794 |
+
border-top-color: #fff;
|
5795 |
+
border-bottom-width: 0;
|
5796 |
+
}
|
5797 |
+
.popover.right > .arrow {
|
5798 |
+
top: 50%;
|
5799 |
+
left: -11px;
|
5800 |
+
margin-top: -11px;
|
5801 |
+
border-right-color: #999;
|
5802 |
+
border-right-color: rgba(0, 0, 0, .25);
|
5803 |
+
border-left-width: 0;
|
5804 |
+
}
|
5805 |
+
.popover.right > .arrow:after {
|
5806 |
+
bottom: -10px;
|
5807 |
+
left: 1px;
|
5808 |
+
content: " ";
|
5809 |
+
border-right-color: #fff;
|
5810 |
+
border-left-width: 0;
|
5811 |
+
}
|
5812 |
+
.popover.bottom > .arrow {
|
5813 |
+
top: -11px;
|
5814 |
+
left: 50%;
|
5815 |
+
margin-left: -11px;
|
5816 |
+
border-top-width: 0;
|
5817 |
+
border-bottom-color: #999;
|
5818 |
+
border-bottom-color: rgba(0, 0, 0, .25);
|
5819 |
+
}
|
5820 |
+
.popover.bottom > .arrow:after {
|
5821 |
+
top: 1px;
|
5822 |
+
margin-left: -10px;
|
5823 |
+
content: " ";
|
5824 |
+
border-top-width: 0;
|
5825 |
+
border-bottom-color: #fff;
|
5826 |
+
}
|
5827 |
+
.popover.left > .arrow {
|
5828 |
+
top: 50%;
|
5829 |
+
right: -11px;
|
5830 |
+
margin-top: -11px;
|
5831 |
+
border-right-width: 0;
|
5832 |
+
border-left-color: #999;
|
5833 |
+
border-left-color: rgba(0, 0, 0, .25);
|
5834 |
+
}
|
5835 |
+
.popover.left > .arrow:after {
|
5836 |
+
right: 1px;
|
5837 |
+
bottom: -10px;
|
5838 |
+
content: " ";
|
5839 |
+
border-right-width: 0;
|
5840 |
+
border-left-color: #fff;
|
5841 |
+
}
|
5842 |
+
.carousel {
|
5843 |
+
position: relative;
|
5844 |
+
}
|
5845 |
+
.carousel-inner {
|
5846 |
+
position: relative;
|
5847 |
+
width: 100%;
|
5848 |
+
overflow: hidden;
|
5849 |
+
}
|
5850 |
+
.carousel-inner > .item {
|
5851 |
+
position: relative;
|
5852 |
+
display: none;
|
5853 |
+
-webkit-transition: .6s ease-in-out left;
|
5854 |
+
-o-transition: .6s ease-in-out left;
|
5855 |
+
transition: .6s ease-in-out left;
|
5856 |
+
}
|
5857 |
+
.carousel-inner > .item > img,
|
5858 |
+
.carousel-inner > .item > a > img {
|
5859 |
+
line-height: 1;
|
5860 |
+
}
|
5861 |
+
@media all and (transform-3d), (-webkit-transform-3d) {
|
5862 |
+
.carousel-inner > .item {
|
5863 |
+
-webkit-transition: -webkit-transform .6s ease-in-out;
|
5864 |
+
-o-transition: -o-transform .6s ease-in-out;
|
5865 |
+
transition: transform .6s ease-in-out;
|
5866 |
+
|
5867 |
+
-webkit-backface-visibility: hidden;
|
5868 |
+
backface-visibility: hidden;
|
5869 |
+
-webkit-perspective: 1000;
|
5870 |
+
perspective: 1000;
|
5871 |
+
}
|
5872 |
+
.carousel-inner > .item.next,
|
5873 |
+
.carousel-inner > .item.active.right {
|
5874 |
+
left: 0;
|
5875 |
+
-webkit-transform: translate3d(100%, 0, 0);
|
5876 |
+
transform: translate3d(100%, 0, 0);
|
5877 |
+
}
|
5878 |
+
.carousel-inner > .item.prev,
|
5879 |
+
.carousel-inner > .item.active.left {
|
5880 |
+
left: 0;
|
5881 |
+
-webkit-transform: translate3d(-100%, 0, 0);
|
5882 |
+
transform: translate3d(-100%, 0, 0);
|
5883 |
+
}
|
5884 |
+
.carousel-inner > .item.next.left,
|
5885 |
+
.carousel-inner > .item.prev.right,
|
5886 |
+
.carousel-inner > .item.active {
|
5887 |
+
left: 0;
|
5888 |
+
-webkit-transform: translate3d(0, 0, 0);
|
5889 |
+
transform: translate3d(0, 0, 0);
|
5890 |
+
}
|
5891 |
+
}
|
5892 |
+
.carousel-inner > .active,
|
5893 |
+
.carousel-inner > .next,
|
5894 |
+
.carousel-inner > .prev {
|
5895 |
+
display: block;
|
5896 |
+
}
|
5897 |
+
.carousel-inner > .active {
|
5898 |
+
left: 0;
|
5899 |
+
}
|
5900 |
+
.carousel-inner > .next,
|
5901 |
+
.carousel-inner > .prev {
|
5902 |
+
position: absolute;
|
5903 |
+
top: 0;
|
5904 |
+
width: 100%;
|
5905 |
+
}
|
5906 |
+
.carousel-inner > .next {
|
5907 |
+
left: 100%;
|
5908 |
+
}
|
5909 |
+
.carousel-inner > .prev {
|
5910 |
+
left: -100%;
|
5911 |
+
}
|
5912 |
+
.carousel-inner > .next.left,
|
5913 |
+
.carousel-inner > .prev.right {
|
5914 |
+
left: 0;
|
5915 |
+
}
|
5916 |
+
.carousel-inner > .active.left {
|
5917 |
+
left: -100%;
|
5918 |
+
}
|
5919 |
+
.carousel-inner > .active.right {
|
5920 |
+
left: 100%;
|
5921 |
+
}
|
5922 |
+
.carousel-control {
|
5923 |
+
position: absolute;
|
5924 |
+
top: 0;
|
5925 |
+
bottom: 0;
|
5926 |
+
left: 0;
|
5927 |
+
width: 15%;
|
5928 |
+
font-size: 20px;
|
5929 |
+
color: #fff;
|
5930 |
+
text-align: center;
|
5931 |
+
text-shadow: 0 1px 2px rgba(0, 0, 0, .6);
|
5932 |
+
filter: alpha(opacity=50);
|
5933 |
+
opacity: .5;
|
5934 |
+
}
|
5935 |
+
.carousel-control.left {
|
5936 |
+
background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
|
5937 |
+
background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
|
5938 |
+
background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001)));
|
5939 |
+
background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
|
5940 |
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);
|
5941 |
+
background-repeat: repeat-x;
|
5942 |
+
}
|
5943 |
+
.carousel-control.right {
|
5944 |
+
right: 0;
|
5945 |
+
left: auto;
|
5946 |
+
background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
|
5947 |
+
background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
|
5948 |
+
background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5)));
|
5949 |
+
background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
|
5950 |
+
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);
|
5951 |
+
background-repeat: repeat-x;
|
5952 |
+
}
|
5953 |
+
.carousel-control:hover,
|
5954 |
+
.carousel-control:focus {
|
5955 |
+
color: #fff;
|
5956 |
+
text-decoration: none;
|
5957 |
+
filter: alpha(opacity=90);
|
5958 |
+
outline: 0;
|
5959 |
+
opacity: .9;
|
5960 |
+
}
|
5961 |
+
.carousel-control .icon-prev,
|
5962 |
+
.carousel-control .icon-next,
|
5963 |
+
.carousel-control .glyphicon-chevron-left,
|
5964 |
+
.carousel-control .glyphicon-chevron-right {
|
5965 |
+
position: absolute;
|
5966 |
+
top: 50%;
|
5967 |
+
z-index: 5;
|
5968 |
+
display: inline-block;
|
5969 |
+
}
|
5970 |
+
.carousel-control .icon-prev,
|
5971 |
+
.carousel-control .glyphicon-chevron-left {
|
5972 |
+
left: 50%;
|
5973 |
+
margin-left: -10px;
|
5974 |
+
}
|
5975 |
+
.carousel-control .icon-next,
|
5976 |
+
.carousel-control .glyphicon-chevron-right {
|
5977 |
+
right: 50%;
|
5978 |
+
margin-right: -10px;
|
5979 |
+
}
|
5980 |
+
.carousel-control .icon-prev,
|
5981 |
+
.carousel-control .icon-next {
|
5982 |
+
width: 20px;
|
5983 |
+
height: 20px;
|
5984 |
+
margin-top: -10px;
|
5985 |
+
font-family: serif;
|
5986 |
+
}
|
5987 |
+
.carousel-control .icon-prev:before {
|
5988 |
+
content: '\2039';
|
5989 |
+
}
|
5990 |
+
.carousel-control .icon-next:before {
|
5991 |
+
content: '\203a';
|
5992 |
+
}
|
5993 |
+
.carousel-indicators {
|
5994 |
+
position: absolute;
|
5995 |
+
bottom: 10px;
|
5996 |
+
left: 50%;
|
5997 |
+
z-index: 15;
|
5998 |
+
width: 60%;
|
5999 |
+
padding-left: 0;
|
6000 |
+
margin-left: -30%;
|
6001 |
+
text-align: center;
|
6002 |
+
list-style: none;
|
6003 |
+
}
|
6004 |
+
.carousel-indicators li {
|
6005 |
+
display: inline-block;
|
6006 |
+
width: 10px;
|
6007 |
+
height: 10px;
|
6008 |
+
margin: 1px;
|
6009 |
+
text-indent: -999px;
|
6010 |
+
cursor: pointer;
|
6011 |
+
background-color: #000 \9;
|
6012 |
+
background-color: rgba(0, 0, 0, 0);
|
6013 |
+
border: 1px solid #fff;
|
6014 |
+
border-radius: 10px;
|
6015 |
+
}
|
6016 |
+
.carousel-indicators .active {
|
6017 |
+
width: 12px;
|
6018 |
+
height: 12px;
|
6019 |
+
margin: 0;
|
6020 |
+
background-color: #fff;
|
6021 |
+
}
|
6022 |
+
.carousel-caption {
|
6023 |
+
position: absolute;
|
6024 |
+
right: 15%;
|
6025 |
+
bottom: 20px;
|
6026 |
+
left: 15%;
|
6027 |
+
z-index: 10;
|
6028 |
+
padding-top: 20px;
|
6029 |
+
padding-bottom: 20px;
|
6030 |
+
color: #fff;
|
6031 |
+
text-align: center;
|
6032 |
+
text-shadow: 0 1px 2px rgba(0, 0, 0, .6);
|
6033 |
+
}
|
6034 |
+
.carousel-caption .btn {
|
6035 |
+
text-shadow: none;
|
6036 |
+
}
|
6037 |
+
@media screen and (min-width: 768px) {
|
6038 |
+
.carousel-control .glyphicon-chevron-left,
|
6039 |
+
.carousel-control .glyphicon-chevron-right,
|
6040 |
+
.carousel-control .icon-prev,
|
6041 |
+
.carousel-control .icon-next {
|
6042 |
+
width: 30px;
|
6043 |
+
height: 30px;
|
6044 |
+
margin-top: -15px;
|
6045 |
+
font-size: 30px;
|
6046 |
+
}
|
6047 |
+
.carousel-control .glyphicon-chevron-left,
|
6048 |
+
.carousel-control .icon-prev {
|
6049 |
+
margin-left: -15px;
|
6050 |
+
}
|
6051 |
+
.carousel-control .glyphicon-chevron-right,
|
6052 |
+
.carousel-control .icon-next {
|
6053 |
+
margin-right: -15px;
|
6054 |
+
}
|
6055 |
+
.carousel-caption {
|
6056 |
+
right: 20%;
|
6057 |
+
left: 20%;
|
6058 |
+
padding-bottom: 30px;
|
6059 |
+
}
|
6060 |
+
.carousel-indicators {
|
6061 |
+
bottom: 20px;
|
6062 |
+
}
|
6063 |
+
}
|
6064 |
+
.clearfix:before,
|
6065 |
+
.clearfix:after,
|
6066 |
+
.dl-horizontal dd:before,
|
6067 |
+
.dl-horizontal dd:after,
|
6068 |
+
.container:before,
|
6069 |
+
.container:after,
|
6070 |
+
.container-fluid:before,
|
6071 |
+
.container-fluid:after,
|
6072 |
+
.row:before,
|
6073 |
+
.row:after,
|
6074 |
+
.form-horizontal .form-group:before,
|
6075 |
+
.form-horizontal .form-group:after,
|
6076 |
+
.btn-toolbar:before,
|
6077 |
+
.btn-toolbar:after,
|
6078 |
+
.btn-group-vertical > .btn-group:before,
|
6079 |
+
.btn-group-vertical > .btn-group:after,
|
6080 |
+
.nav:before,
|
6081 |
+
.nav:after,
|
6082 |
+
.navbar:before,
|
6083 |
+
.navbar:after,
|
6084 |
+
.navbar-header:before,
|
6085 |
+
.navbar-header:after,
|
6086 |
+
.navbar-collapse:before,
|
6087 |
+
.navbar-collapse:after,
|
6088 |
+
.pager:before,
|
6089 |
+
.pager:after,
|
6090 |
+
.panel-body:before,
|
6091 |
+
.panel-body:after,
|
6092 |
+
.modal-footer:before,
|
6093 |
+
.modal-footer:after {
|
6094 |
+
display: table;
|
6095 |
+
content: " ";
|
6096 |
+
}
|
6097 |
+
.clearfix:after,
|
6098 |
+
.dl-horizontal dd:after,
|
6099 |
+
.container:after,
|
6100 |
+
.container-fluid:after,
|
6101 |
+
.row:after,
|
6102 |
+
.form-horizontal .form-group:after,
|
6103 |
+
.btn-toolbar:after,
|
6104 |
+
.btn-group-vertical > .btn-group:after,
|
6105 |
+
.nav:after,
|
6106 |
+
.navbar:after,
|
6107 |
+
.navbar-header:after,
|
6108 |
+
.navbar-collapse:after,
|
6109 |
+
.pager:after,
|
6110 |
+
.panel-body:after,
|
6111 |
+
.modal-footer:after {
|
6112 |
+
clear: both;
|
6113 |
+
}
|
6114 |
+
.center-block {
|
6115 |
+
display: block;
|
6116 |
+
margin-right: auto;
|
6117 |
+
margin-left: auto;
|
6118 |
+
}
|
6119 |
+
.pull-right {
|
6120 |
+
float: right !important;
|
6121 |
+
}
|
6122 |
+
.pull-left {
|
6123 |
+
float: left !important;
|
6124 |
+
}
|
6125 |
+
.hide {
|
6126 |
+
display: none !important;
|
6127 |
+
}
|
6128 |
+
.show {
|
6129 |
+
display: block !important;
|
6130 |
+
}
|
6131 |
+
.invisible {
|
6132 |
+
visibility: hidden;
|
6133 |
+
}
|
6134 |
+
.text-hide {
|
6135 |
+
font: 0/0 a;
|
6136 |
+
color: transparent;
|
6137 |
+
text-shadow: none;
|
6138 |
+
background-color: transparent;
|
6139 |
+
border: 0;
|
6140 |
+
}
|
6141 |
+
.hidden {
|
6142 |
+
display: none !important;
|
6143 |
+
visibility: hidden !important;
|
6144 |
+
}
|
6145 |
+
.affix {
|
6146 |
+
position: fixed;
|
6147 |
+
}
|
6148 |
+
@-ms-viewport {
|
6149 |
+
width: device-width;
|
6150 |
+
}
|
6151 |
+
.visible-xs,
|
6152 |
+
.visible-sm,
|
6153 |
+
.visible-md,
|
6154 |
+
.visible-lg {
|
6155 |
+
display: none !important;
|
6156 |
+
}
|
6157 |
+
.visible-xs-block,
|
6158 |
+
.visible-xs-inline,
|
6159 |
+
.visible-xs-inline-block,
|
6160 |
+
.visible-sm-block,
|
6161 |
+
.visible-sm-inline,
|
6162 |
+
.visible-sm-inline-block,
|
6163 |
+
.visible-md-block,
|
6164 |
+
.visible-md-inline,
|
6165 |
+
.visible-md-inline-block,
|
6166 |
+
.visible-lg-block,
|
6167 |
+
.visible-lg-inline,
|
6168 |
+
.visible-lg-inline-block {
|
6169 |
+
display: none !important;
|
6170 |
+
}
|
6171 |
+
@media (max-width: 767px) {
|
6172 |
+
.visible-xs {
|
6173 |
+
display: block !important;
|
6174 |
+
}
|
6175 |
+
table.visible-xs {
|
6176 |
+
display: table;
|
6177 |
+
}
|
6178 |
+
tr.visible-xs {
|
6179 |
+
display: table-row !important;
|
6180 |
+
}
|
6181 |
+
th.visible-xs,
|
6182 |
+
td.visible-xs {
|
6183 |
+
display: table-cell !important;
|
6184 |
+
}
|
6185 |
+
}
|
6186 |
+
@media (max-width: 767px) {
|
6187 |
+
.visible-xs-block {
|
6188 |
+
display: block !important;
|
6189 |
+
}
|
6190 |
+
}
|
6191 |
+
@media (max-width: 767px) {
|
6192 |
+
.visible-xs-inline {
|
6193 |
+
display: inline !important;
|
6194 |
+
}
|
6195 |
+
}
|
6196 |
+
@media (max-width: 767px) {
|
6197 |
+
.visible-xs-inline-block {
|
6198 |
+
display: inline-block !important;
|
6199 |
+
}
|
6200 |
+
}
|
6201 |
+
@media (min-width: 768px) and (max-width: 991px) {
|
6202 |
+
.visible-sm {
|
6203 |
+
display: block !important;
|
6204 |
+
}
|
6205 |
+
table.visible-sm {
|
6206 |
+
display: table;
|
6207 |
+
}
|
6208 |
+
tr.visible-sm {
|
6209 |
+
display: table-row !important;
|
6210 |
+
}
|
6211 |
+
th.visible-sm,
|
6212 |
+
td.visible-sm {
|
6213 |
+
display: table-cell !important;
|
6214 |
+
}
|
6215 |
+
}
|
6216 |
+
@media (min-width: 768px) and (max-width: 991px) {
|
6217 |
+
.visible-sm-block {
|
6218 |
+
display: block !important;
|
6219 |
+
}
|
6220 |
+
}
|
6221 |
+
@media (min-width: 768px) and (max-width: 991px) {
|
6222 |
+
.visible-sm-inline {
|
6223 |
+
display: inline !important;
|
6224 |
+
}
|
6225 |
+
}
|
6226 |
+
@media (min-width: 768px) and (max-width: 991px) {
|
6227 |
+
.visible-sm-inline-block {
|
6228 |
+
display: inline-block !important;
|
6229 |
+
}
|
6230 |
+
}
|
6231 |
+
@media (min-width: 992px) and (max-width: 1199px) {
|
6232 |
+
.visible-md {
|
6233 |
+
display: block !important;
|
6234 |
+
}
|
6235 |
+
table.visible-md {
|
6236 |
+
display: table;
|
6237 |
+
}
|
6238 |
+
tr.visible-md {
|
6239 |
+
display: table-row !important;
|
6240 |
+
}
|
6241 |
+
th.visible-md,
|
6242 |
+
td.visible-md {
|
6243 |
+
display: table-cell !important;
|
6244 |
+
}
|
6245 |
+
}
|
6246 |
+
@media (min-width: 992px) and (max-width: 1199px) {
|
6247 |
+
.visible-md-block {
|
6248 |
+
display: block !important;
|
6249 |
+
}
|
6250 |
+
}
|
6251 |
+
@media (min-width: 992px) and (max-width: 1199px) {
|
6252 |
+
.visible-md-inline {
|
6253 |
+
display: inline !important;
|
6254 |
+
}
|
6255 |
+
}
|
6256 |
+
@media (min-width: 992px) and (max-width: 1199px) {
|
6257 |
+
.visible-md-inline-block {
|
6258 |
+
display: inline-block !important;
|
6259 |
+
}
|
6260 |
+
}
|
6261 |
+
@media (min-width: 1200px) {
|
6262 |
+
.visible-lg {
|
6263 |
+
display: block !important;
|
6264 |
+
}
|
6265 |
+
table.visible-lg {
|
6266 |
+
display: table;
|
6267 |
+
}
|
6268 |
+
tr.visible-lg {
|
6269 |
+
display: table-row !important;
|
6270 |
+
}
|
6271 |
+
th.visible-lg,
|
6272 |
+
td.visible-lg {
|
6273 |
+
display: table-cell !important;
|
6274 |
+
}
|
6275 |
+
}
|
6276 |
+
@media (min-width: 1200px) {
|
6277 |
+
.visible-lg-block {
|
6278 |
+
display: block !important;
|
6279 |
+
}
|
6280 |
+
}
|
6281 |
+
@media (min-width: 1200px) {
|
6282 |
+
.visible-lg-inline {
|
6283 |
+
display: inline !important;
|
6284 |
+
}
|
6285 |
+
}
|
6286 |
+
@media (min-width: 1200px) {
|
6287 |
+
.visible-lg-inline-block {
|
6288 |
+
display: inline-block !important;
|
6289 |
+
}
|
6290 |
+
}
|
6291 |
+
@media (max-width: 767px) {
|
6292 |
+
.hidden-xs {
|
6293 |
+
display: none !important;
|
6294 |
+
}
|
6295 |
+
}
|
6296 |
+
@media (min-width: 768px) and (max-width: 991px) {
|
6297 |
+
.hidden-sm {
|
6298 |
+
display: none !important;
|
6299 |
+
}
|
6300 |
+
}
|
6301 |
+
@media (min-width: 992px) and (max-width: 1199px) {
|
6302 |
+
.hidden-md {
|
6303 |
+
display: none !important;
|
6304 |
+
}
|
6305 |
+
}
|
6306 |
+
@media (min-width: 1200px) {
|
6307 |
+
.hidden-lg {
|
6308 |
+
display: none !important;
|
6309 |
+
}
|
6310 |
+
}
|
6311 |
+
.visible-print {
|
6312 |
+
display: none !important;
|
6313 |
+
}
|
6314 |
+
@media print {
|
6315 |
+
.visible-print {
|
6316 |
+
display: block !important;
|
6317 |
+
}
|
6318 |
+
table.visible-print {
|
6319 |
+
display: table;
|
6320 |
+
}
|
6321 |
+
tr.visible-print {
|
6322 |
+
display: table-row !important;
|
6323 |
+
}
|
6324 |
+
th.visible-print,
|
6325 |
+
td.visible-print {
|
6326 |
+
display: table-cell !important;
|
6327 |
+
}
|
6328 |
+
}
|
6329 |
+
.visible-print-block {
|
6330 |
+
display: none !important;
|
6331 |
+
}
|
6332 |
+
@media print {
|
6333 |
+
.visible-print-block {
|
6334 |
+
display: block !important;
|
6335 |
+
}
|
6336 |
+
}
|
6337 |
+
.visible-print-inline {
|
6338 |
+
display: none !important;
|
6339 |
+
}
|
6340 |
+
@media print {
|
6341 |
+
.visible-print-inline {
|
6342 |
+
display: inline !important;
|
6343 |
+
}
|
6344 |
+
}
|
6345 |
+
.visible-print-inline-block {
|
6346 |
+
display: none !important;
|
6347 |
+
}
|
6348 |
+
@media print {
|
6349 |
+
.visible-print-inline-block {
|
6350 |
+
display: inline-block !important;
|
6351 |
+
}
|
6352 |
+
}
|
6353 |
+
@media print {
|
6354 |
+
.hidden-print {
|
6355 |
+
display: none !important;
|
6356 |
+
}
|
6357 |
+
}
|
6358 |
+
/*# sourceMappingURL=bootstrap.css.map */
|
lib/bootstrap/css/bootstrap.css.map
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
{"version":3,"sources":["bootstrap.css","less/normalize.less","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"AAAA,6DAA4D;ACQ5D;EACE,yBAAA;EACA,4BAAA;EACA,gCAAA;EDND;ACaD;EACE,WAAA;EDXD;ACwBD;;;;;;;;;;;;;EAaE,gBAAA;EDtBD;AC8BD;;;;EAIE,uBAAA;EACA,0BAAA;ED5BD;ACoCD;EACE,eAAA;EACA,WAAA;EDlCD;AC0CD;;EAEE,eAAA;EDxCD;ACkDD;EACE,+BAAA;EDhDD;ACuDD;;EAEE,YAAA;EDrDD;AC+DD;EACE,2BAAA;ED7DD;ACoED;;EAEE,mBAAA;EDlED;ACyED;EACE,oBAAA;EDvED;AC+ED;EACE,gBAAA;EACA,kBAAA;ED7ED;ACoFD;EACE,kBAAA;EACA,aAAA;EDlFD;ACyFD;EACE,gBAAA;EDvFD;AC8FD;;EAEE,gBAAA;EACA,gBAAA;EACA,oBAAA;EACA,0BAAA;ED5FD;AC+FD;EACE,aAAA;ED7FD;ACgGD;EACE,iBAAA;ED9FD;ACwGD;EACE,WAAA;EDtGD;AC6GD;EACE,kBAAA;ED3GD;ACqHD;EACE,kBAAA;EDnHD;AC0HD;EACE,8BAAA;EACA,iCAAA;UAAA,yBAAA;EACA,WAAA;EDxHD;AC+HD;EACE,gBAAA;ED7HD;ACoID;;;;EAIE,mCAAA;EACA,gBAAA;EDlID;ACoJD;;;;;EAKE,gBAAA;EACA,eAAA;EACA,WAAA;EDlJD;ACyJD;EACE,mBAAA;EDvJD;ACiKD;;EAEE,sBAAA;ED/JD;AC0KD;;;;EAIE,4BAAA;EACA,iBAAA;EDxKD;AC+KD;;EAEE,iBAAA;ED7KD;ACoLD;;EAEE,WAAA;EACA,YAAA;EDlLD;AC0LD;EACE,qBAAA;EDxLD;ACmMD;;EAEE,gCAAA;KAAA,6BAAA;UAAA,wBAAA;EACA,YAAA;EDjMD;AC0MD;;EAEE,cAAA;EDxMD;ACiND;EACE,+BAAA;EACA,8BAAA;EACA,iCAAA;EACA,yBAAA;ED/MD;ACwND;;EAEE,0BAAA;EDtND;AC6ND;EACE,2BAAA;EACA,eAAA;EACA,gCAAA;ED3ND;ACmOD;EACE,WAAA;EACA,YAAA;EDjOD;ACwOD;EACE,gBAAA;EDtOD;AC8OD;EACE,mBAAA;ED5OD;ACsPD;EACE,2BAAA;EACA,mBAAA;EDpPD;ACuPD;;EAEE,YAAA;EDrPD;AACD,sFAAqF;AE1ErF;EAnGI;;;IAGI,oCAAA;IACA,wBAAA;IACA,qCAAA;YAAA,6BAAA;IACA,8BAAA;IFgLL;EE7KC;;IAEI,4BAAA;IF+KL;EE5KC;IACI,8BAAA;IF8KL;EE3KC;IACI,+BAAA;IF6KL;EExKC;;IAEI,aAAA;IF0KL;EEvKC;;IAEI,wBAAA;IACA,0BAAA;IFyKL;EEtKC;IACI,6BAAA;IFwKL;EErKC;;IAEI,0BAAA;IFuKL;EEpKC;IACI,4BAAA;IFsKL;EEnKC;;;IAGI,YAAA;IACA,WAAA;IFqKL;EElKC;;IAEI,yBAAA;IFoKL;EE7JC;IACI,6BAAA;IF+JL;EE3JC;IACI,eAAA;IF6JL;EE3JC;;IAGQ,mCAAA;IF4JT;EEzJC;IACI,wBAAA;IF2JL;EExJC;IACI,sCAAA;IF0JL;EE3JC;;IAKQ,mCAAA;IF0JT;EEvJC;;IAGQ,mCAAA;IFwJT;EACF;AGpPD;EACE,qCAAA;EACA,uDAAA;EACA,6TAAA;EHsPD;AG/OD;EACE,oBAAA;EACA,UAAA;EACA,uBAAA;EACA,qCAAA;EACA,oBAAA;EACA,qBAAA;EACA,gBAAA;EACA,qCAAA;EACA,oCAAA;EHiPD;AG7OmC;EAAW,gBAAA;EHgP9C;AG/OmC;EAAW,gBAAA;EHkP9C;AGhPmC;;EAAW,kBAAA;EHoP9C;AGnPmC;EAAW,kBAAA;EHsP9C;AGrPmC;EAAW,kBAAA;EHwP9C;AGvPmC;EAAW,kBAAA;EH0P9C;AGzPmC;EAAW,kBAAA;EH4P9C;AG3PmC;EAAW,kBAAA;EH8P9C;AG7PmC;EAAW,kBAAA;EHgQ9C;AG/PmC;EAAW,kBAAA;EHkQ9C;AGjQmC;EAAW,kBAAA;EHoQ9C;AGnQmC;EAAW,kBAAA;EHsQ9C;AGrQmC;EAAW,kBAAA;EHwQ9C;AGvQmC;EAAW,kBAAA;EH0Q9C;AGzQmC;EAAW,kBAAA;EH4Q9C;AG3QmC;EAAW,kBAAA;EH8Q9C;AG7QmC;EAAW,kBAAA;EHgR9C;AG/QmC;EAAW,kBAAA;EHkR9C;AGjRmC;EAAW,kBAAA;EHoR9C;AGnRmC;EAAW,kBAAA;EHsR9C;AGrRmC;EAAW,kBAAA;EHwR9C;AGvRmC;EAAW,kBAAA;EH0R9C;AGzRmC;EAAW,kBAAA;EH4R9C;AG3RmC;EAAW,kBAAA;EH8R9C;AG7RmC;EAAW,kBAAA;EHgS9C;AG/RmC;EAAW,kBAAA;EHkS9C;AGjSmC;EAAW,kBAAA;EHoS9C;AGnSmC;EAAW,kBAAA;EHsS9C;AGrSmC;EAAW,kBAAA;EHwS9C;AGvSmC;EAAW,kBAAA;EH0S9C;AGzSmC;EAAW,kBAAA;EH4S9C;AG3SmC;EAAW,kBAAA;EH8S9C;AG7SmC;EAAW,kBAAA;EHgT9C;AG/SmC;EAAW,kBAAA;EHkT9C;AGjTmC;EAAW,kBAAA;EHoT9C;AGnTmC;EAAW,kBAAA;EHsT9C;AGrTmC;EAAW,kBAAA;EHwT9C;AGvTmC;EAAW,kBAAA;EH0T9C;AGzTmC;EAAW,kBAAA;EH4T9C;AG3TmC;EAAW,kBAAA;EH8T9C;AG7TmC;EAAW,kBAAA;EHgU9C;AG/TmC;EAAW,kBAAA;EHkU9C;AGjUmC;EAAW,kBAAA;EHoU9C;AGnUmC;EAAW,kBAAA;EHsU9C;AGrUmC;EAAW,kBAAA;EHwU9C;AGvUmC;EAAW,kBAAA;EH0U9C;AGzUmC;EAAW,kBAAA;EH4U9C;AG3UmC;EAAW,kBAAA;EH8U9C;AG7UmC;EAAW,kBAAA;EHgV9C;AG/UmC;EAAW,kBAAA;EHkV9C;AGjVmC;EAAW,kBAAA;EHoV9C;AGnVmC;EAAW,kBAAA;EHsV9C;AGrVmC;EAAW,kBAAA;EHwV9C;AGvVmC;EAAW,kBAAA;EH0V9C;AGzVmC;EAAW,kBAAA;EH4V9C;AG3VmC;EAAW,kBAAA;EH8V9C;AG7VmC;EAAW,kBAAA;EHgW9C;AG/VmC;EAAW,kBAAA;EHkW9C;AGjWmC;EAAW,kBAAA;EHoW9C;AGnWmC;EAAW,kBAAA;EHsW9C;AGrWmC;EAAW,kBAAA;EHwW9C;AGvWmC;EAAW,kBAAA;EH0W9C;AGzWmC;EAAW,kBAAA;EH4W9C;AG3WmC;EAAW,kBAAA;EH8W9C;AG7WmC;EAAW,kBAAA;EHgX9C;AG/WmC;EAAW,kBAAA;EHkX9C;AGjXmC;EAAW,kBAAA;EHoX9C;AGnXmC;EAAW,kBAAA;EHsX9C;AGrXmC;EAAW,kBAAA;EHwX9C;AGvXmC;EAAW,kBAAA;EH0X9C;AGzXmC;EAAW,kBAAA;EH4X9C;AG3XmC;EAAW,kBAAA;EH8X9C;AG7XmC;EAAW,kBAAA;EHgY9C;AG/XmC;EAAW,kBAAA;EHkY9C;AGjYmC;EAAW,kBAAA;EHoY9C;AGnYmC;EAAW,kBAAA;EHsY9C;AGrYmC;EAAW,kBAAA;EHwY9C;AGvYmC;EAAW,kBAAA;EH0Y9C;AGzYmC;EAAW,kBAAA;EH4Y9C;AG3YmC;EAAW,kBAAA;EH8Y9C;AG7YmC;EAAW,kBAAA;EHgZ9C;AG/YmC;EAAW,kBAAA;EHkZ9C;AGjZmC;EAAW,kBAAA;EHoZ9C;AGnZmC;EAAW,kBAAA;EHsZ9C;AGrZmC;EAAW,kBAAA;EHwZ9C;AGvZmC;EAAW,kBAAA;EH0Z9C;AGzZmC;EAAW,kBAAA;EH4Z9C;AG3ZmC;EAAW,kBAAA;EH8Z9C;AG7ZmC;EAAW,kBAAA;EHga9C;AG/ZmC;EAAW,kBAAA;EHka9C;AGjamC;EAAW,kBAAA;EHoa9C;AGnamC;EAAW,kBAAA;EHsa9C;AGramC;EAAW,kBAAA;EHwa9C;AGvamC;EAAW,kBAAA;EH0a9C;AGzamC;EAAW,kBAAA;EH4a9C;AG3amC;EAAW,kBAAA;EH8a9C;AG7amC;EAAW,kBAAA;EHgb9C;AG/amC;EAAW,kBAAA;EHkb9C;AGjbmC;EAAW,kBAAA;EHob9C;AGnbmC;EAAW,kBAAA;EHsb9C;AGrbmC;EAAW,kBAAA;EHwb9C;AGvbmC;EAAW,kBAAA;EH0b9C;AGzbmC;EAAW,kBAAA;EH4b9C;AG3bmC;EAAW,kBAAA;EH8b9C;AG7bmC;EAAW,kBAAA;EHgc9C;AG/bmC;EAAW,kBAAA;EHkc9C;AGjcmC;EAAW,kBAAA;EHoc9C;AGncmC;EAAW,kBAAA;EHsc9C;AGrcmC;EAAW,kBAAA;EHwc9C;AGvcmC;EAAW,kBAAA;EH0c9C;AGzcmC;EAAW,kBAAA;EH4c9C;AG3cmC;EAAW,kBAAA;EH8c9C;AG7cmC;EAAW,kBAAA;EHgd9C;AG/cmC;EAAW,kBAAA;EHkd9C;AGjdmC;EAAW,kBAAA;EHod9C;AGndmC;EAAW,kBAAA;EHsd9C;AGrdmC;EAAW,kBAAA;EHwd9C;AGvdmC;EAAW,kBAAA;EH0d9C;AGzdmC;EAAW,kBAAA;EH4d9C;AG3dmC;EAAW,kBAAA;EH8d9C;AG7dmC;EAAW,kBAAA;EHge9C;AG/dmC;EAAW,kBAAA;EHke9C;AGjemC;EAAW,kBAAA;EHoe9C;AGnemC;EAAW,kBAAA;EHse9C;AGremC;EAAW,kBAAA;EHwe9C;AGvemC;EAAW,kBAAA;EH0e9C;AGzemC;EAAW,kBAAA;EH4e9C;AG3emC;EAAW,kBAAA;EH8e9C;AG7emC;EAAW,kBAAA;EHgf9C;AG/emC;EAAW,kBAAA;EHkf9C;AGjfmC;EAAW,kBAAA;EHof9C;AGnfmC;EAAW,kBAAA;EHsf9C;AGrfmC;EAAW,kBAAA;EHwf9C;AGvfmC;EAAW,kBAAA;EH0f9C;AGzfmC;EAAW,kBAAA;EH4f9C;AG3fmC;EAAW,kBAAA;EH8f9C;AG7fmC;EAAW,kBAAA;EHggB9C;AG/fmC;EAAW,kBAAA;EHkgB9C;AGjgBmC;EAAW,kBAAA;EHogB9C;AGngBmC;EAAW,kBAAA;EHsgB9C;AGrgBmC;EAAW,kBAAA;EHwgB9C;AGvgBmC;EAAW,kBAAA;EH0gB9C;AGzgBmC;EAAW,kBAAA;EH4gB9C;AG3gBmC;EAAW,kBAAA;EH8gB9C;AG7gBmC;EAAW,kBAAA;EHghB9C;AG/gBmC;EAAW,kBAAA;EHkhB9C;AGjhBmC;EAAW,kBAAA;EHohB9C;AGnhBmC;EAAW,kBAAA;EHshB9C;AGrhBmC;EAAW,kBAAA;EHwhB9C;AGvhBmC;EAAW,kBAAA;EH0hB9C;AGzhBmC;EAAW,kBAAA;EH4hB9C;AG3hBmC;EAAW,kBAAA;EH8hB9C;AG7hBmC;EAAW,kBAAA;EHgiB9C;AG/hBmC;EAAW,kBAAA;EHkiB9C;AGjiBmC;EAAW,kBAAA;EHoiB9C;AGniBmC;EAAW,kBAAA;EHsiB9C;AGriBmC;EAAW,kBAAA;EHwiB9C;AGviBmC;EAAW,kBAAA;EH0iB9C;AGziBmC;EAAW,kBAAA;EH4iB9C;AG3iBmC;EAAW,kBAAA;EH8iB9C;AG7iBmC;EAAW,kBAAA;EHgjB9C;AG/iBmC;EAAW,kBAAA;EHkjB9C;AGjjBmC;EAAW,kBAAA;EHojB9C;AGnjBmC;EAAW,kBAAA;EHsjB9C;AGrjBmC;EAAW,kBAAA;EHwjB9C;AGvjBmC;EAAW,kBAAA;EH0jB9C;AGzjBmC;EAAW,kBAAA;EH4jB9C;AG3jBmC;EAAW,kBAAA;EH8jB9C;AG7jBmC;EAAW,kBAAA;EHgkB9C;AG/jBmC;EAAW,kBAAA;EHkkB9C;AGjkBmC;EAAW,kBAAA;EHokB9C;AGnkBmC;EAAW,kBAAA;EHskB9C;AGrkBmC;EAAW,kBAAA;EHwkB9C;AGvkBmC;EAAW,kBAAA;EH0kB9C;AGzkBmC;EAAW,kBAAA;EH4kB9C;AG3kBmC;EAAW,kBAAA;EH8kB9C;AG7kBmC;EAAW,kBAAA;EHglB9C;AG/kBmC;EAAW,kBAAA;EHklB9C;AGjlBmC;EAAW,kBAAA;EHolB9C;AGnlBmC;EAAW,kBAAA;EHslB9C;AGrlBmC;EAAW,kBAAA;EHwlB9C;AGvlBmC;EAAW,kBAAA;EH0lB9C;AGzlBmC;EAAW,kBAAA;EH4lB9C;AG3lBmC;EAAW,kBAAA;EH8lB9C;AG7lBmC;EAAW,kBAAA;EHgmB9C;AG/lBmC;EAAW,kBAAA;EHkmB9C;AGjmBmC;EAAW,kBAAA;EHomB9C;AGnmBmC;EAAW,kBAAA;EHsmB9C;AGrmBmC;EAAW,kBAAA;EHwmB9C;AGvmBmC;EAAW,kBAAA;EH0mB9C;AGzmBmC;EAAW,kBAAA;EH4mB9C;AG3mBmC;EAAW,kBAAA;EH8mB9C;AG7mBmC;EAAW,kBAAA;EHgnB9C;AG/mBmC;EAAW,kBAAA;EHknB9C;AGjnBmC;EAAW,kBAAA;EHonB9C;AGnnBmC;EAAW,kBAAA;EHsnB9C;AGrnBmC;EAAW,kBAAA;EHwnB9C;AGvnBmC;EAAW,kBAAA;EH0nB9C;AGznBmC;EAAW,kBAAA;EH4nB9C;AG3nBmC;EAAW,kBAAA;EH8nB9C;AI71BD;ECgEE,gCAAA;EACG,6BAAA;EACK,wBAAA;ELgyBT;AI/1BD;;EC6DE,gCAAA;EACG,6BAAA;EACK,wBAAA;ELsyBT;AI71BD;EACE,iBAAA;EACA,+CAAA;EJ+1BD;AI51BD;EACE,6DAAA;EACA,iBAAA;EACA,yBAAA;EACA,gBAAA;EACA,2BAAA;EJ81BD;AI11BD;;;;EAIE,sBAAA;EACA,oBAAA;EACA,sBAAA;EJ41BD;AIt1BD;EACE,gBAAA;EACA,uBAAA;EJw1BD;AIt1BC;;EAEE,gBAAA;EACA,4BAAA;EJw1BH;AIr1BC;EErDA,sBAAA;EAEA,4CAAA;EACA,sBAAA;EN44BD;AI/0BD;EACE,WAAA;EJi1BD;AI30BD;EACE,wBAAA;EJ60BD;AIz0BD;;;;;EGvEE,gBAAA;EACA,iBAAA;EACA,cAAA;EPu5BD;AI70BD;EACE,oBAAA;EJ+0BD;AIz0BD;EACE,cAAA;EACA,yBAAA;EACA,2BAAA;EACA,2BAAA;EACA,oBAAA;EC6FA,0CAAA;EACK,qCAAA;EACG,kCAAA;EEvLR,uBAAA;EACA,iBAAA;EACA,cAAA;EPu6BD;AIz0BD;EACE,oBAAA;EJ20BD;AIr0BD;EACE,kBAAA;EACA,qBAAA;EACA,WAAA;EACA,+BAAA;EJu0BD;AI/zBD;EACE,oBAAA;EACA,YAAA;EACA,aAAA;EACA,cAAA;EACA,YAAA;EACA,kBAAA;EACA,wBAAA;EACA,WAAA;EJi0BD;AIzzBC;;EAEE,kBAAA;EACA,aAAA;EACA,cAAA;EACA,WAAA;EACA,mBAAA;EACA,YAAA;EJ2zBH;AQt8BD;;;;;;;;;;;;EAEE,sBAAA;EACA,kBAAA;EACA,kBAAA;EACA,gBAAA;ERk9BD;AQv9BD;;;;;;;;;;;;;;;;;;;;;;;;EASI,qBAAA;EACA,gBAAA;EACA,gBAAA;ERw+BH;AQp+BD;;;;;;EAGE,kBAAA;EACA,qBAAA;ERy+BD;AQ7+BD;;;;;;;;;;;;EAQI,gBAAA;ERm/BH;AQh/BD;;;;;;EAGE,kBAAA;EACA,qBAAA;ERq/BD;AQz/BD;;;;;;;;;;;;EAQI,gBAAA;ER+/BH;AQ3/BD;;EAAU,iBAAA;ER+/BT;AQ9/BD;;EAAU,iBAAA;ERkgCT;AQjgCD;;EAAU,iBAAA;ERqgCT;AQpgCD;;EAAU,iBAAA;ERwgCT;AQvgCD;;EAAU,iBAAA;ER2gCT;AQ1gCD;;EAAU,iBAAA;ER8gCT;AQxgCD;EACE,kBAAA;ER0gCD;AQvgCD;EACE,qBAAA;EACA,iBAAA;EACA,kBAAA;EACA,kBAAA;ERygCD;AQpgCD;EAAA;IAFI,iBAAA;IR0gCD;EACF;AQlgCD;;EAEE,gBAAA;ERogCD;AQjgCD;;EAEE,2BAAA;EACA,eAAA;ERmgCD;AQ//BD;EAAuB,kBAAA;ERkgCtB;AQjgCD;EAAuB,mBAAA;ERogCtB;AQngCD;EAAuB,oBAAA;ERsgCtB;AQrgCD;EAAuB,qBAAA;ERwgCtB;AQvgCD;EAAuB,qBAAA;ER0gCtB;AQvgCD;EAAuB,2BAAA;ER0gCtB;AQzgCD;EAAuB,2BAAA;ER4gCtB;AQ3gCD;EAAuB,4BAAA;ER8gCtB;AQ3gCD;EACE,gBAAA;ER6gCD;AQ3gCD;ECrGE,gBAAA;ETmnCD;ASlnCC;EACE,gBAAA;ETonCH;AQ9gCD;ECxGE,gBAAA;ETynCD;ASxnCC;EACE,gBAAA;ET0nCH;AQjhCD;EC3GE,gBAAA;ET+nCD;AS9nCC;EACE,gBAAA;ETgoCH;AQphCD;EC9GE,gBAAA;ETqoCD;ASpoCC;EACE,gBAAA;ETsoCH;AQvhCD;ECjHE,gBAAA;ET2oCD;AS1oCC;EACE,gBAAA;ET4oCH;AQthCD;EAGE,aAAA;EE3HA,2BAAA;EVkpCD;AUjpCC;EACE,2BAAA;EVmpCH;AQvhCD;EE9HE,2BAAA;EVwpCD;AUvpCC;EACE,2BAAA;EVypCH;AQ1hCD;EEjIE,2BAAA;EV8pCD;AU7pCC;EACE,2BAAA;EV+pCH;AQ7hCD;EEpIE,2BAAA;EVoqCD;AUnqCC;EACE,2BAAA;EVqqCH;AQhiCD;EEvIE,2BAAA;EV0qCD;AUzqCC;EACE,2BAAA;EV2qCH;AQ9hCD;EACE,qBAAA;EACA,qBAAA;EACA,kCAAA;ERgiCD;AQxhCD;;EAEE,eAAA;EACA,qBAAA;ER0hCD;AQ7hCD;;;;EAMI,kBAAA;ER6hCH;AQthCD;EACE,iBAAA;EACA,kBAAA;ERwhCD;AQphCD;EALE,iBAAA;EACA,kBAAA;EAMA,mBAAA;ERuhCD;AQzhCD;EAKI,uBAAA;EACA,mBAAA;EACA,oBAAA;ERuhCH;AQlhCD;EACE,eAAA;EACA,qBAAA;ERohCD;AQlhCD;;EAEE,yBAAA;ERohCD;AQlhCD;EACE,mBAAA;ERohCD;AQlhCD;EACE,gBAAA;ERohCD;AQ3/BD;EAAA;IAVM,aAAA;IACA,cAAA;IACA,aAAA;IACA,mBAAA;IGtNJ,kBAAA;IACA,yBAAA;IACA,qBAAA;IXguCC;EQrgCH;IAHM,oBAAA;IR2gCH;EACF;AQlgCD;;EAGE,cAAA;EACA,mCAAA;ERmgCD;AQjgCD;EACE,gBAAA;EACA,2BAAA;ERmgCD;AQ//BD;EACE,oBAAA;EACA,kBAAA;EACA,mBAAA;EACA,gCAAA;ERigCD;AQ5/BG;;;EACE,kBAAA;ERggCL;AQ1gCD;;;EAmBI,gBAAA;EACA,gBAAA;EACA,yBAAA;EACA,gBAAA;ER4/BH;AQ1/BG;;;EACE,wBAAA;ER8/BL;AQt/BD;;EAEE,qBAAA;EACA,iBAAA;EACA,iCAAA;EACA,gBAAA;EACA,mBAAA;ERw/BD;AQl/BG;;;;;;EAAW,aAAA;ER0/Bd;AQz/BG;;;;;;EACE,wBAAA;ERggCL;AQ1/BD;EACE,qBAAA;EACA,oBAAA;EACA,yBAAA;ER4/BD;AYlyCD;;;;EAIE,gEAAA;EZoyCD;AYhyCD;EACE,kBAAA;EACA,gBAAA;EACA,gBAAA;EACA,2BAAA;EACA,oBAAA;EZkyCD;AY9xCD;EACE,kBAAA;EACA,gBAAA;EACA,gBAAA;EACA,2BAAA;EACA,oBAAA;EACA,wDAAA;UAAA,gDAAA;EZgyCD;AYtyCD;EASI,YAAA;EACA,iBAAA;EACA,mBAAA;EACA,0BAAA;UAAA,kBAAA;EZgyCH;AY3xCD;EACE,gBAAA;EACA,gBAAA;EACA,kBAAA;EACA,iBAAA;EACA,yBAAA;EACA,uBAAA;EACA,uBAAA;EACA,gBAAA;EACA,2BAAA;EACA,2BAAA;EACA,oBAAA;EZ6xCD;AYxyCD;EAeI,YAAA;EACA,oBAAA;EACA,gBAAA;EACA,uBAAA;EACA,+BAAA;EACA,kBAAA;EZ4xCH;AYvxCD;EACE,mBAAA;EACA,oBAAA;EZyxCD;Aan1CD;ECHE,oBAAA;EACA,mBAAA;EACA,oBAAA;EACA,qBAAA;Edy1CD;Aan1CC;EAAA;IAFE,cAAA;Iby1CD;EACF;Aar1CC;EAAA;IAFE,cAAA;Ib21CD;EACF;Aav1CD;EAAA;IAFI,eAAA;Ib61CD;EACF;Aap1CD;ECvBE,oBAAA;EACA,mBAAA;EACA,oBAAA;EACA,qBAAA;Ed82CD;Aaj1CD;ECvBE,oBAAA;EACA,qBAAA;Ed22CD;Ae32CG;EACE,oBAAA;EAEA,iBAAA;EAEA,oBAAA;EACA,qBAAA;Ef22CL;Ae31CG;EACE,aAAA;Ef61CL;Aet1CC;EACE,aAAA;Efw1CH;Aez1CC;EACE,qBAAA;Ef21CH;Ae51CC;EACE,qBAAA;Ef81CH;Ae/1CC;EACE,YAAA;Efi2CH;Ael2CC;EACE,qBAAA;Efo2CH;Aer2CC;EACE,qBAAA;Efu2CH;Aex2CC;EACE,YAAA;Ef02CH;Ae32CC;EACE,qBAAA;Ef62CH;Ae92CC;EACE,qBAAA;Efg3CH;Aej3CC;EACE,YAAA;Efm3CH;Aep3CC;EACE,qBAAA;Efs3CH;Aev3CC;EACE,oBAAA;Efy3CH;Ae32CC;EACE,aAAA;Ef62CH;Ae92CC;EACE,qBAAA;Efg3CH;Aej3CC;EACE,qBAAA;Efm3CH;Aep3CC;EACE,YAAA;Efs3CH;Aev3CC;EACE,qBAAA;Efy3CH;Ae13CC;EACE,qBAAA;Ef43CH;Ae73CC;EACE,YAAA;Ef+3CH;Aeh4CC;EACE,qBAAA;Efk4CH;Aen4CC;EACE,qBAAA;Efq4CH;Aet4CC;EACE,YAAA;Efw4CH;Aez4CC;EACE,qBAAA;Ef24CH;Ae54CC;EACE,oBAAA;Ef84CH;Ae14CC;EACE,aAAA;Ef44CH;Ae55CC;EACE,YAAA;Ef85CH;Ae/5CC;EACE,oBAAA;Efi6CH;Ael6CC;EACE,oBAAA;Efo6CH;Aer6CC;EACE,WAAA;Efu6CH;Aex6CC;EACE,oBAAA;Ef06CH;Ae36CC;EACE,oBAAA;Ef66CH;Ae96CC;EACE,WAAA;Efg7CH;Aej7CC;EACE,oBAAA;Efm7CH;Aep7CC;EACE,oBAAA;Efs7CH;Aev7CC;EACE,WAAA;Efy7CH;Ae17CC;EACE,oBAAA;Ef47CH;Ae77CC;EACE,mBAAA;Ef+7CH;Ae37CC;EACE,YAAA;Ef67CH;Ae/6CC;EACE,mBAAA;Efi7CH;Ael7CC;EACE,2BAAA;Efo7CH;Aer7CC;EACE,2BAAA;Efu7CH;Aex7CC;EACE,kBAAA;Ef07CH;Ae37CC;EACE,2BAAA;Ef67CH;Ae97CC;EACE,2BAAA;Efg8CH;Aej8CC;EACE,kBAAA;Efm8CH;Aep8CC;EACE,2BAAA;Efs8CH;Aev8CC;EACE,2BAAA;Efy8CH;Ae18CC;EACE,kBAAA;Ef48CH;Ae78CC;EACE,2BAAA;Ef+8CH;Aeh9CC;EACE,0BAAA;Efk9CH;Aen9CC;EACE,iBAAA;Efq9CH;Aaz9CD;EE9BI;IACE,aAAA;If0/CH;Een/CD;IACE,aAAA;Ifq/CD;Eet/CD;IACE,qBAAA;Ifw/CD;Eez/CD;IACE,qBAAA;If2/CD;Ee5/CD;IACE,YAAA;If8/CD;Ee//CD;IACE,qBAAA;IfigDD;EelgDD;IACE,qBAAA;IfogDD;EergDD;IACE,YAAA;IfugDD;EexgDD;IACE,qBAAA;If0gDD;Ee3gDD;IACE,qBAAA;If6gDD;Ee9gDD;IACE,YAAA;IfghDD;EejhDD;IACE,qBAAA;IfmhDD;EephDD;IACE,oBAAA;IfshDD;EexgDD;IACE,aAAA;If0gDD;Ee3gDD;IACE,qBAAA;If6gDD;Ee9gDD;IACE,qBAAA;IfghDD;EejhDD;IACE,YAAA;IfmhDD;EephDD;IACE,qBAAA;IfshDD;EevhDD;IACE,qBAAA;IfyhDD;Ee1hDD;IACE,YAAA;If4hDD;Ee7hDD;IACE,qBAAA;If+hDD;EehiDD;IACE,qBAAA;IfkiDD;EeniDD;IACE,YAAA;IfqiDD;EetiDD;IACE,qBAAA;IfwiDD;EeziDD;IACE,oBAAA;If2iDD;EeviDD;IACE,aAAA;IfyiDD;EezjDD;IACE,YAAA;If2jDD;Ee5jDD;IACE,oBAAA;If8jDD;Ee/jDD;IACE,oBAAA;IfikDD;EelkDD;IACE,WAAA;IfokDD;EerkDD;IACE,oBAAA;IfukDD;EexkDD;IACE,oBAAA;If0kDD;Ee3kDD;IACE,WAAA;If6kDD;Ee9kDD;IACE,oBAAA;IfglDD;EejlDD;IACE,oBAAA;IfmlDD;EeplDD;IACE,WAAA;IfslDD;EevlDD;IACE,oBAAA;IfylDD;Ee1lDD;IACE,mBAAA;If4lDD;EexlDD;IACE,YAAA;If0lDD;Ee5kDD;IACE,mBAAA;If8kDD;Ee/kDD;IACE,2BAAA;IfilDD;EellDD;IACE,2BAAA;IfolDD;EerlDD;IACE,kBAAA;IfulDD;EexlDD;IACE,2BAAA;If0lDD;Ee3lDD;IACE,2BAAA;If6lDD;Ee9lDD;IACE,kBAAA;IfgmDD;EejmDD;IACE,2BAAA;IfmmDD;EepmDD;IACE,2BAAA;IfsmDD;EevmDD;IACE,kBAAA;IfymDD;Ee1mDD;IACE,2BAAA;If4mDD;Ee7mDD;IACE,0BAAA;If+mDD;EehnDD;IACE,iBAAA;IfknDD;EACF;Aa9mDD;EEvCI;IACE,aAAA;IfwpDH;EejpDD;IACE,aAAA;IfmpDD;EeppDD;IACE,qBAAA;IfspDD;EevpDD;IACE,qBAAA;IfypDD;Ee1pDD;IACE,YAAA;If4pDD;Ee7pDD;IACE,qBAAA;If+pDD;EehqDD;IACE,qBAAA;IfkqDD;EenqDD;IACE,YAAA;IfqqDD;EetqDD;IACE,qBAAA;IfwqDD;EezqDD;IACE,qBAAA;If2qDD;Ee5qDD;IACE,YAAA;If8qDD;Ee/qDD;IACE,qBAAA;IfirDD;EelrDD;IACE,oBAAA;IforDD;EetqDD;IACE,aAAA;IfwqDD;EezqDD;IACE,qBAAA;If2qDD;Ee5qDD;IACE,qBAAA;If8qDD;Ee/qDD;IACE,YAAA;IfirDD;EelrDD;IACE,qBAAA;IforDD;EerrDD;IACE,qBAAA;IfurDD;EexrDD;IACE,YAAA;If0rDD;Ee3rDD;IACE,qBAAA;If6rDD;Ee9rDD;IACE,qBAAA;IfgsDD;EejsDD;IACE,YAAA;IfmsDD;EepsDD;IACE,qBAAA;IfssDD;EevsDD;IACE,oBAAA;IfysDD;EersDD;IACE,aAAA;IfusDD;EevtDD;IACE,YAAA;IfytDD;Ee1tDD;IACE,oBAAA;If4tDD;Ee7tDD;IACE,oBAAA;If+tDD;EehuDD;IACE,WAAA;IfkuDD;EenuDD;IACE,oBAAA;IfquDD;EetuDD;IACE,oBAAA;IfwuDD;EezuDD;IACE,WAAA;If2uDD;Ee5uDD;IACE,oBAAA;If8uDD;Ee/uDD;IACE,oBAAA;IfivDD;EelvDD;IACE,WAAA;IfovDD;EervDD;IACE,oBAAA;IfuvDD;EexvDD;IACE,mBAAA;If0vDD;EetvDD;IACE,YAAA;IfwvDD;Ee1uDD;IACE,mBAAA;If4uDD;Ee7uDD;IACE,2BAAA;If+uDD;EehvDD;IACE,2BAAA;IfkvDD;EenvDD;IACE,kBAAA;IfqvDD;EetvDD;IACE,2BAAA;IfwvDD;EezvDD;IACE,2BAAA;If2vDD;Ee5vDD;IACE,kBAAA;If8vDD;Ee/vDD;IACE,2BAAA;IfiwDD;EelwDD;IACE,2BAAA;IfowDD;EerwDD;IACE,kBAAA;IfuwDD;EexwDD;IACE,2BAAA;If0wDD;Ee3wDD;IACE,0BAAA;If6wDD;Ee9wDD;IACE,iBAAA;IfgxDD;EACF;AarwDD;EE9CI;IACE,aAAA;IfszDH;Ee/yDD;IACE,aAAA;IfizDD;EelzDD;IACE,qBAAA;IfozDD;EerzDD;IACE,qBAAA;IfuzDD;EexzDD;IACE,YAAA;If0zDD;Ee3zDD;IACE,qBAAA;If6zDD;Ee9zDD;IACE,qBAAA;Ifg0DD;Eej0DD;IACE,YAAA;Ifm0DD;Eep0DD;IACE,qBAAA;Ifs0DD;Eev0DD;IACE,qBAAA;Ify0DD;Ee10DD;IACE,YAAA;If40DD;Ee70DD;IACE,qBAAA;If+0DD;Eeh1DD;IACE,oBAAA;Ifk1DD;Eep0DD;IACE,aAAA;Ifs0DD;Eev0DD;IACE,qBAAA;Ify0DD;Ee10DD;IACE,qBAAA;If40DD;Ee70DD;IACE,YAAA;If+0DD;Eeh1DD;IACE,qBAAA;Ifk1DD;Een1DD;IACE,qBAAA;Ifq1DD;Eet1DD;IACE,YAAA;Ifw1DD;Eez1DD;IACE,qBAAA;If21DD;Ee51DD;IACE,qBAAA;If81DD;Ee/1DD;IACE,YAAA;Ifi2DD;Eel2DD;IACE,qBAAA;Ifo2DD;Eer2DD;IACE,oBAAA;Ifu2DD;Een2DD;IACE,aAAA;Ifq2DD;Eer3DD;IACE,YAAA;Ifu3DD;Eex3DD;IACE,oBAAA;If03DD;Ee33DD;IACE,oBAAA;If63DD;Ee93DD;IACE,WAAA;Ifg4DD;Eej4DD;IACE,oBAAA;Ifm4DD;Eep4DD;IACE,oBAAA;Ifs4DD;Eev4DD;IACE,WAAA;Ify4DD;Ee14DD;IACE,oBAAA;If44DD;Ee74DD;IACE,oBAAA;If+4DD;Eeh5DD;IACE,WAAA;Ifk5DD;Een5DD;IACE,oBAAA;Ifq5DD;Eet5DD;IACE,mBAAA;Ifw5DD;Eep5DD;IACE,YAAA;Ifs5DD;Eex4DD;IACE,mBAAA;If04DD;Ee34DD;IACE,2BAAA;If64DD;Ee94DD;IACE,2BAAA;Ifg5DD;Eej5DD;IACE,kBAAA;Ifm5DD;Eep5DD;IACE,2BAAA;Ifs5DD;Eev5DD;IACE,2BAAA;Ify5DD;Ee15DD;IACE,kBAAA;If45DD;Ee75DD;IACE,2BAAA;If+5DD;Eeh6DD;IACE,2BAAA;Ifk6DD;Een6DD;IACE,kBAAA;Ifq6DD;Eet6DD;IACE,2BAAA;Ifw6DD;Eez6DD;IACE,0BAAA;If26DD;Ee56DD;IACE,iBAAA;If86DD;EACF;AgBl/DD;EACE,+BAAA;EhBo/DD;AgBl/DD;EACE,kBAAA;EACA,qBAAA;EACA,gBAAA;EACA,kBAAA;EhBo/DD;AgBl/DD;EACE,kBAAA;EhBo/DD;AgB9+DD;EACE,aAAA;EACA,iBAAA;EACA,qBAAA;EhBg/DD;AgBn/DD;;;;;;EAWQ,cAAA;EACA,yBAAA;EACA,qBAAA;EACA,+BAAA;EhBg/DP;AgB9/DD;EAoBI,wBAAA;EACA,kCAAA;EhB6+DH;AgBlgED;;;;;;EA8BQ,eAAA;EhB4+DP;AgB1gED;EAoCI,+BAAA;EhBy+DH;AgB7gED;EAyCI,2BAAA;EhBu+DH;AgBh+DD;;;;;;EAOQ,cAAA;EhBi+DP;AgBt9DD;EACE,2BAAA;EhBw9DD;AgBz9DD;;;;;;EAQQ,2BAAA;EhBy9DP;AgBj+DD;;EAeM,0BAAA;EhBs9DL;AgB58DD;EAEI,2BAAA;EhB68DH;AgBp8DD;EAEI,2BAAA;EhBq8DH;AgB57DD;EACE,kBAAA;EACA,aAAA;EACA,uBAAA;EhB87DD;AgBz7DG;;EACE,kBAAA;EACA,aAAA;EACA,qBAAA;EhB47DL;AiBxkEC;;;;;;;;;;;;EAOI,2BAAA;EjB+kEL;AiBzkEC;;;;;EAMI,2BAAA;EjB0kEL;AiB7lEC;;;;;;;;;;;;EAOI,2BAAA;EjBomEL;AiB9lEC;;;;;EAMI,2BAAA;EjB+lEL;AiBlnEC;;;;;;;;;;;;EAOI,2BAAA;EjBynEL;AiBnnEC;;;;;EAMI,2BAAA;EjBonEL;AiBvoEC;;;;;;;;;;;;EAOI,2BAAA;EjB8oEL;AiBxoEC;;;;;EAMI,2BAAA;EjByoEL;AiB5pEC;;;;;;;;;;;;EAOI,2BAAA;EjBmqEL;AiB7pEC;;;;;EAMI,2BAAA;EjB8pEL;AgB5gED;EACE,kBAAA;EACA,mBAAA;EhB8gED;AgBj9DD;EAAA;IA1DI,aAAA;IACA,qBAAA;IACA,oBAAA;IACA,8CAAA;IACA,2BAAA;IhB+gED;EgBz9DH;IAlDM,kBAAA;IhB8gEH;EgB59DH;;;;;;IAzCY,qBAAA;IhB6gET;EgBp+DH;IAjCM,WAAA;IhBwgEH;EgBv+DH;;;;;;IAxBY,gBAAA;IhBugET;EgB/+DH;;;;;;IApBY,iBAAA;IhB2gET;EgBv/DH;;;;IAPY,kBAAA;IhBogET;EACF;AkB9tED;EACE,YAAA;EACA,WAAA;EACA,WAAA;EAIA,cAAA;ElB6tED;AkB1tED;EACE,gBAAA;EACA,aAAA;EACA,YAAA;EACA,qBAAA;EACA,iBAAA;EACA,sBAAA;EACA,gBAAA;EACA,WAAA;EACA,kCAAA;ElB4tED;AkBztED;EACE,uBAAA;EACA,iBAAA;EACA,oBAAA;EACA,mBAAA;ElB2tED;AkBhtED;Eb4BE,gCAAA;EACG,6BAAA;EACK,wBAAA;ELurET;AkBhtED;;EAEE,iBAAA;EACA,oBAAA;EACA,qBAAA;ElBktED;AkB9sED;EACE,gBAAA;ElBgtED;AkB5sED;EACE,gBAAA;EACA,aAAA;ElB8sED;AkB1sED;;EAEE,cAAA;ElB4sED;AkBxsED;;;EZxEE,sBAAA;EAEA,4CAAA;EACA,sBAAA;ENoxED;AkBxsED;EACE,gBAAA;EACA,kBAAA;EACA,iBAAA;EACA,yBAAA;EACA,gBAAA;ElB0sED;AkBhrED;EACE,gBAAA;EACA,aAAA;EACA,cAAA;EACA,mBAAA;EACA,iBAAA;EACA,yBAAA;EACA,gBAAA;EACA,2BAAA;EACA,wBAAA;EACA,2BAAA;EACA,oBAAA;EbzDA,0DAAA;EACQ,kDAAA;EAyHR,wFAAA;EACK,2EAAA;EACG,wEAAA;ELonET;AmB5vEC;EACE,uBAAA;EACA,YAAA;EdUF,wFAAA;EACQ,gFAAA;ELqvET;AKptEC;EACE,gBAAA;EACA,YAAA;ELstEH;AKptEC;EAA0B,gBAAA;ELutE3B;AKttEC;EAAgC,gBAAA;ELytEjC;AkBxrEC;;;EAGE,qBAAA;EACA,2BAAA;EACA,YAAA;ElB0rEH;AkBtrEC;EACE,cAAA;ElBwrEH;AkB5qED;EACE,0BAAA;ElB8qED;AkBlqED;;;;EAIE,mBAAA;EAEA,4BAAA;ElBmqED;AkBjqEC;;;;EACE,mBAAA;EACA,qBAAA;ElBsqEH;AkBpqEC;;;;EACE,mBAAA;EACA,sBAAA;ElByqEH;AkBpqED;;;;;;;;EAIE,yBAAA;ElB0qED;AkBxqEC;;;;;;;;EACE,kBAAA;ElBirEH;AkB/qEC;;;;;;;;EACE,mBAAA;ElBwrEH;AkB9qED;EACE,qBAAA;ElBgrED;AkBxqED;;EAEE,oBAAA;EACA,gBAAA;EACA,kBAAA;EACA,qBAAA;ElB0qED;AkB/qED;;EAQI,kBAAA;EACA,oBAAA;EACA,kBAAA;EACA,qBAAA;EACA,iBAAA;ElB2qEH;AkBxqED;;;;EAIE,oBAAA;EACA,oBAAA;EACA,oBAAA;ElB0qED;AkBvqED;;EAEE,kBAAA;ElByqED;AkBrqED;;EAEE,uBAAA;EACA,oBAAA;EACA,kBAAA;EACA,wBAAA;EACA,qBAAA;EACA,iBAAA;ElBuqED;AkBrqED;;EAEE,eAAA;EACA,mBAAA;ElBuqED;AkB9pEC;;;;;;EAGE,qBAAA;ElBmqEH;AkB7pEC;;;;EAEE,qBAAA;ElBiqEH;AkB3pEC;;;;EAGI,qBAAA;ElB8pEL;AkBnpED;EAEE,kBAAA;EACA,qBAAA;EAEA,kBAAA;ElBmpED;AkBjpEC;;EAEE,iBAAA;EACA,kBAAA;ElBmpEH;AkBzoED;;EChQE,cAAA;EACA,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,oBAAA;EnB64ED;AmB34EC;;EACE,cAAA;EACA,mBAAA;EnB84EH;AmB34EC;;;;EAEE,cAAA;EnB+4EH;AkBvpED;;ECrQE,cAAA;EACA,oBAAA;EACA,iBAAA;EACA,mBAAA;EACA,oBAAA;EnBg6ED;AmB95EC;;EACE,cAAA;EACA,mBAAA;EnBi6EH;AmB95EC;;;;EAEE,cAAA;EnBk6EH;AkBhqED;EAEE,oBAAA;ElBiqED;AkBnqED;EAMI,uBAAA;ElBgqEH;AkB5pED;EACE,oBAAA;EACA,QAAA;EACA,UAAA;EACA,YAAA;EACA,gBAAA;EACA,aAAA;EACA,cAAA;EACA,mBAAA;EACA,oBAAA;EACA,sBAAA;ElB8pED;AkB5pED;EACE,aAAA;EACA,cAAA;EACA,mBAAA;ElB8pED;AkB5pED;EACE,aAAA;EACA,cAAA;EACA,mBAAA;ElB8pED;AkB1pED;;;;;;;;;;ECrWI,gBAAA;EnB2gFH;AkBtqED;ECjWI,uBAAA;Ed+CF,0DAAA;EACQ,kDAAA;EL49ET;AmB1gFG;EACE,uBAAA;Ed4CJ,2EAAA;EACQ,mEAAA;ELi+ET;AkBhrED;ECvVI,gBAAA;EACA,uBAAA;EACA,2BAAA;EnB0gFH;AkBrrED;ECjVI,gBAAA;EnBygFH;AkBrrED;;;;;;;;;;ECxWI,gBAAA;EnByiFH;AkBjsED;ECpWI,uBAAA;Ed+CF,0DAAA;EACQ,kDAAA;EL0/ET;AmBxiFG;EACE,uBAAA;Ed4CJ,2EAAA;EACQ,mEAAA;EL+/ET;AkB3sED;EC1VI,gBAAA;EACA,uBAAA;EACA,2BAAA;EnBwiFH;AkBhtED;ECpVI,gBAAA;EnBuiFH;AkBhtED;;;;;;;;;;EC3WI,gBAAA;EnBukFH;AkB5tED;ECvWI,uBAAA;Ed+CF,0DAAA;EACQ,kDAAA;ELwhFT;AmBtkFG;EACE,uBAAA;Ed4CJ,2EAAA;EACQ,mEAAA;EL6hFT;AkBtuED;EC7VI,gBAAA;EACA,uBAAA;EACA,2BAAA;EnBskFH;AkB3uED;ECvVI,gBAAA;EnBqkFH;AkBvuEC;EACG,WAAA;ElByuEJ;AkBvuEC;EACG,QAAA;ElByuEJ;AkB/tED;EACE,gBAAA;EACA,iBAAA;EACA,qBAAA;EACA,gBAAA;ElBiuED;AkB7oED;EAAA;IA/DM,uBAAA;IACA,kBAAA;IACA,wBAAA;IlBgtEH;EkBnpEH;IAxDM,uBAAA;IACA,aAAA;IACA,wBAAA;IlB8sEH;EkBxpEH;IAjDM,uBAAA;IlB4sEH;EkB3pEH;IA7CM,uBAAA;IACA,wBAAA;IlB2sEH;EkB/pEH;;;IAvCQ,aAAA;IlB2sEL;EkBpqEH;IAjCM,aAAA;IlBwsEH;EkBvqEH;IA7BM,kBAAA;IACA,wBAAA;IlBusEH;EkB3qEH;;IApBM,uBAAA;IACA,eAAA;IACA,kBAAA;IACA,wBAAA;IlBmsEH;EkBlrEH;;IAdQ,iBAAA;IlBosEL;EkBtrEH;;IATM,oBAAA;IACA,gBAAA;IlBmsEH;EkB3rEH;IAHM,QAAA;IlBisEH;EACF;AkBvrED;;;;EASI,eAAA;EACA,kBAAA;EACA,kBAAA;ElBorEH;AkB/rED;;EAiBI,kBAAA;ElBkrEH;AkBnsED;EJleE,oBAAA;EACA,qBAAA;EdwqFD;AkBpqEC;EAAA;IANI,mBAAA;IACA,kBAAA;IACA,kBAAA;IlB8qEH;EACF;AkB9sED;EAwCI,aAAA;ElByqEH;AkB5pEC;EAAA;IAHM,qBAAA;IlBmqEL;EACF;AkB1pEC;EAAA;IAHM,kBAAA;IlBiqEL;EACF;AoBpsFD;EACE,uBAAA;EACA,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,wBAAA;EACA,gCAAA;MAAA,4BAAA;EACA,iBAAA;EACA,wBAAA;EACA,+BAAA;EACA,qBAAA;EC6BA,mBAAA;EACA,iBAAA;EACA,yBAAA;EACA,oBAAA;EhB4KA,2BAAA;EACG,wBAAA;EACC,uBAAA;EACI,mBAAA;EL+/ET;AoBvsFG;;;;;;EdrBF,sBAAA;EAEA,4CAAA;EACA,sBAAA;ENmuFD;AoB3sFC;;;EAGE,gBAAA;EACA,uBAAA;EpB6sFH;AoB1sFC;;EAEE,YAAA;EACA,wBAAA;Ef2BF,0DAAA;EACQ,kDAAA;ELkrFT;AoB1sFC;;;EAGE,qBAAA;EACA,sBAAA;EE9CF,eAAA;EAGA,2BAAA;EjB8DA,0BAAA;EACQ,kBAAA;EL4rFT;AoBtsFD;ECrDE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErB8vFD;AqB5vFC;;;;;;EAME,gBAAA;EACA,2BAAA;EACI,uBAAA;ErB8vFP;AqB5vFC;;;EAGE,wBAAA;ErB8vFH;AqBzvFG;;;;;;;;;;;;;;;;;;EAME,2BAAA;EACI,uBAAA;ErBuwFT;AoB/uFD;ECnBI,gBAAA;EACA,2BAAA;ErBqwFH;AoBhvFD;ECxDE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErB2yFD;AqBzyFC;;;;;;EAME,gBAAA;EACA,2BAAA;EACI,uBAAA;ErB2yFP;AqBzyFC;;;EAGE,wBAAA;ErB2yFH;AqBtyFG;;;;;;;;;;;;;;;;;;EAME,2BAAA;EACI,uBAAA;ErBozFT;AoBzxFD;ECtBI,gBAAA;EACA,2BAAA;ErBkzFH;AoBzxFD;EC5DE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErBw1FD;AqBt1FC;;;;;;EAME,gBAAA;EACA,2BAAA;EACI,uBAAA;ErBw1FP;AqBt1FC;;;EAGE,wBAAA;ErBw1FH;AqBn1FG;;;;;;;;;;;;;;;;;;EAME,2BAAA;EACI,uBAAA;ErBi2FT;AoBl0FD;EC1BI,gBAAA;EACA,2BAAA;ErB+1FH;AoBl0FD;EChEE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErBq4FD;AqBn4FC;;;;;;EAME,gBAAA;EACA,2BAAA;EACI,uBAAA;ErBq4FP;AqBn4FC;;;EAGE,wBAAA;ErBq4FH;AqBh4FG;;;;;;;;;;;;;;;;;;EAME,2BAAA;EACI,uBAAA;ErB84FT;AoB32FD;EC9BI,gBAAA;EACA,2BAAA;ErB44FH;AoB32FD;ECpEE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErBk7FD;AqBh7FC;;;;;;EAME,gBAAA;EACA,2BAAA;EACI,uBAAA;ErBk7FP;AqBh7FC;;;EAGE,wBAAA;ErBk7FH;AqB76FG;;;;;;;;;;;;;;;;;;EAME,2BAAA;EACI,uBAAA;ErB27FT;AoBp5FD;EClCI,gBAAA;EACA,2BAAA;ErBy7FH;AoBp5FD;ECxEE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErB+9FD;AqB79FC;;;;;;EAME,gBAAA;EACA,2BAAA;EACI,uBAAA;ErB+9FP;AqB79FC;;;EAGE,wBAAA;ErB+9FH;AqB19FG;;;;;;;;;;;;;;;;;;EAME,2BAAA;EACI,uBAAA;ErBw+FT;AoB77FD;ECtCI,gBAAA;EACA,2BAAA;ErBs+FH;AoBx7FD;EACE,gBAAA;EACA,qBAAA;EACA,kBAAA;EpB07FD;AoBx7FC;;;;;EAKE,+BAAA;Ef7BF,0BAAA;EACQ,kBAAA;ELw9FT;AoBz7FC;;;;EAIE,2BAAA;EpB27FH;AoBz7FC;;EAEE,gBAAA;EACA,4BAAA;EACA,+BAAA;EpB27FH;AoBv7FG;;;;EAEE,gBAAA;EACA,uBAAA;EpB27FL;AoBl7FD;;EC/EE,oBAAA;EACA,iBAAA;EACA,mBAAA;EACA,oBAAA;ErBqgGD;AoBr7FD;;ECnFE,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,oBAAA;ErB4gGD;AoBx7FD;;ECvFE,kBAAA;EACA,iBAAA;EACA,kBAAA;EACA,oBAAA;ErBmhGD;AoBv7FD;EACE,gBAAA;EACA,aAAA;EpBy7FD;AoBr7FD;EACE,iBAAA;EpBu7FD;AoBh7FC;;;EACE,aAAA;EpBo7FH;AuBxkGD;EACE,YAAA;ElBoLA,0CAAA;EACK,qCAAA;EACG,kCAAA;ELu5FT;AuB3kGC;EACE,YAAA;EvB6kGH;AuBzkGD;EACE,eAAA;EACA,oBAAA;EvB2kGD;AuBzkGC;EAAY,gBAAA;EAAgB,qBAAA;EvB6kG7B;AuB5kGC;EAAY,oBAAA;EvB+kGb;AuB9kGC;EAAY,0BAAA;EvBilGb;AuB9kGD;EACE,oBAAA;EACA,WAAA;EACA,kBAAA;ElBsKA,iDAAA;EACQ,4CAAA;KAAA,yCAAA;EAOR,oCAAA;EACQ,+BAAA;KAAA,4BAAA;EAGR,0CAAA;EACQ,qCAAA;KAAA,kCAAA;ELm6FT;AwB7mGD;EACE,uBAAA;EACA,UAAA;EACA,WAAA;EACA,kBAAA;EACA,wBAAA;EACA,uBAAA;EACA,qCAAA;EACA,oCAAA;ExB+mGD;AwB3mGD;EACE,oBAAA;ExB6mGD;AwBzmGD;EACE,YAAA;ExB2mGD;AwBvmGD;EACE,oBAAA;EACA,WAAA;EACA,SAAA;EACA,eAAA;EACA,eAAA;EACA,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,kBAAA;EACA,iBAAA;EACA,kBAAA;EACA,2BAAA;EACA,2BAAA;EACA,uCAAA;EACA,oBAAA;EnBwBA,qDAAA;EACQ,6CAAA;EmBvBR,sCAAA;UAAA,8BAAA;ExB0mGD;AwBrmGC;EACE,UAAA;EACA,YAAA;ExBumGH;AwBhoGD;ECvBE,aAAA;EACA,eAAA;EACA,kBAAA;EACA,2BAAA;EzB0pGD;AwBtoGD;EAmCI,gBAAA;EACA,mBAAA;EACA,aAAA;EACA,qBAAA;EACA,yBAAA;EACA,gBAAA;EACA,qBAAA;ExBsmGH;AwBhmGC;;EAEE,uBAAA;EACA,gBAAA;EACA,2BAAA;ExBkmGH;AwB5lGC;;;EAGE,gBAAA;EACA,uBAAA;EACA,YAAA;EACA,2BAAA;ExB8lGH;AwBrlGC;;;EAGE,gBAAA;ExBulGH;AwBnlGC;;EAEE,uBAAA;EACA,+BAAA;EACA,wBAAA;EEzGF,qEAAA;EF2GE,qBAAA;ExBqlGH;AwBhlGD;EAGI,gBAAA;ExBglGH;AwBnlGD;EAQI,YAAA;ExB8kGH;AwBtkGD;EACE,YAAA;EACA,UAAA;ExBwkGD;AwBhkGD;EACE,SAAA;EACA,aAAA;ExBkkGD;AwB9jGD;EACE,gBAAA;EACA,mBAAA;EACA,iBAAA;EACA,yBAAA;EACA,gBAAA;EACA,qBAAA;ExBgkGD;AwB5jGD;EACE,iBAAA;EACA,SAAA;EACA,UAAA;EACA,WAAA;EACA,QAAA;EACA,cAAA;ExB8jGD;AwB1jGD;EACE,UAAA;EACA,YAAA;ExB4jGD;AwBpjGD;;EAII,eAAA;EACA,0BAAA;EACA,aAAA;ExBojGH;AwB1jGD;;EAUI,WAAA;EACA,cAAA;EACA,oBAAA;ExBojGH;AwB/hGD;EAXE;IAnEA,YAAA;IACA,UAAA;IxBinGC;EwB/iGD;IAzDA,SAAA;IACA,aAAA;IxB2mGC;EACF;A2BzvGD;;EAEE,oBAAA;EACA,uBAAA;EACA,wBAAA;E3B2vGD;A2B/vGD;;EAMI,oBAAA;EACA,aAAA;E3B6vGH;A2B3vGG;;;;;;;;EAIE,YAAA;E3BiwGL;A2B/vGG;;EAEE,YAAA;E3BiwGL;A2B3vGD;;;;EAKI,mBAAA;E3B4vGH;A2BvvGD;EACE,mBAAA;E3ByvGD;A2B1vGD;;EAMI,aAAA;E3BwvGH;A2B9vGD;;;EAWI,kBAAA;E3BwvGH;A2BpvGD;EACE,kBAAA;E3BsvGD;A2BlvGD;EACE,gBAAA;E3BovGD;A2BnvGC;ECrDA,+BAAA;EACG,4BAAA;E5B2yGJ;A2BlvGD;;EClDE,8BAAA;EACG,2BAAA;E5BwyGJ;A2BjvGD;EACE,aAAA;E3BmvGD;A2BjvGD;EACE,kBAAA;E3BmvGD;A2BjvGD;;ECtEE,+BAAA;EACG,4BAAA;E5B2zGJ;A2BhvGD;ECpEE,8BAAA;EACG,2BAAA;E5BuzGJ;A2B/uGD;;EAEE,YAAA;E3BivGD;A2BhuGD;EACE,mBAAA;EACA,oBAAA;E3BkuGD;A2BhuGD;EACE,oBAAA;EACA,qBAAA;E3BkuGD;A2B7tGD;EtBlDE,0DAAA;EACQ,kDAAA;ELkxGT;A2B7tGC;EtBtDA,0BAAA;EACQ,kBAAA;ELsxGT;A2B1tGD;EACE,gBAAA;E3B4tGD;A2BztGD;EACE,yBAAA;EACA,wBAAA;E3B2tGD;A2BxtGD;EACE,yBAAA;E3B0tGD;A2BntGD;;;EAII,gBAAA;EACA,aAAA;EACA,aAAA;EACA,iBAAA;E3BotGH;A2B3tGD;EAcM,aAAA;E3BgtGL;A2B9tGD;;;;EAsBI,kBAAA;EACA,gBAAA;E3B8sGH;A2BzsGC;EACE,kBAAA;E3B2sGH;A2BzsGC;EACE,8BAAA;ECvKF,+BAAA;EACC,8BAAA;E5Bm3GF;A2B1sGC;EACE,gCAAA;ECnLF,4BAAA;EACC,2BAAA;E5Bg4GF;A2B1sGD;EACE,kBAAA;E3B4sGD;A2B1sGD;;EClLE,+BAAA;EACC,8BAAA;E5Bg4GF;A2BzsGD;EChME,4BAAA;EACC,2BAAA;E5B44GF;A2BrsGD;EACE,gBAAA;EACA,aAAA;EACA,qBAAA;EACA,2BAAA;E3BusGD;A2B3sGD;;EAOI,aAAA;EACA,qBAAA;EACA,WAAA;E3BwsGH;A2BjtGD;EAYI,aAAA;E3BwsGH;A2BptGD;EAgBI,YAAA;E3BusGH;A2BtrGD;;;;EAKM,oBAAA;EACA,wBAAA;EACA,sBAAA;E3BurGL;A6Bp6GD;EACE,oBAAA;EACA,gBAAA;EACA,2BAAA;E7Bs6GD;A6Bn6GC;EACE,aAAA;EACA,iBAAA;EACA,kBAAA;E7Bq6GH;A6B96GD;EAeI,oBAAA;EACA,YAAA;EAKA,aAAA;EAEA,aAAA;EACA,kBAAA;E7B65GH;A6Bp5GD;;;EV8BE,cAAA;EACA,oBAAA;EACA,iBAAA;EACA,mBAAA;EACA,oBAAA;EnB23GD;AmBz3GC;;;EACE,cAAA;EACA,mBAAA;EnB63GH;AmB13GC;;;;;;EAEE,cAAA;EnBg4GH;A6Bt6GD;;;EVyBE,cAAA;EACA,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,oBAAA;EnBk5GD;AmBh5GC;;;EACE,cAAA;EACA,mBAAA;EnBo5GH;AmBj5GC;;;;;;EAEE,cAAA;EnBu5GH;A6Bp7GD;;;EAGE,qBAAA;E7Bs7GD;A6Bp7GC;;;EACE,kBAAA;E7Bw7GH;A6Bp7GD;;EAEE,WAAA;EACA,qBAAA;EACA,wBAAA;E7Bs7GD;A6Bj7GD;EACE,mBAAA;EACA,iBAAA;EACA,qBAAA;EACA,gBAAA;EACA,gBAAA;EACA,oBAAA;EACA,2BAAA;EACA,2BAAA;EACA,oBAAA;E7Bm7GD;A6Bh7GC;EACE,mBAAA;EACA,iBAAA;EACA,oBAAA;E7Bk7GH;A6Bh7GC;EACE,oBAAA;EACA,iBAAA;EACA,oBAAA;E7Bk7GH;A6Bt8GD;;EA0BI,eAAA;E7Bg7GH;A6B36GD;;;;;;;EDhGE,+BAAA;EACG,4BAAA;E5BohHJ;A6B56GD;EACE,iBAAA;E7B86GD;A6B56GD;;;;;;;EDpGE,8BAAA;EACG,2BAAA;E5ByhHJ;A6B76GD;EACE,gBAAA;E7B+6GD;A6B16GD;EACE,oBAAA;EAGA,cAAA;EACA,qBAAA;E7B06GD;A6B/6GD;EAUI,oBAAA;E7Bw6GH;A6Bl7GD;EAYM,mBAAA;E7By6GL;A6Bt6GG;;;EAGE,YAAA;E7Bw6GL;A6Bn6GC;;EAGI,oBAAA;E7Bo6GL;A6Bj6GC;;EAGI,mBAAA;E7Bk6GL;A8B5jHD;EACE,kBAAA;EACA,iBAAA;EACA,kBAAA;E9B8jHD;A8BjkHD;EAOI,oBAAA;EACA,gBAAA;E9B6jHH;A8BrkHD;EAWM,oBAAA;EACA,gBAAA;EACA,oBAAA;E9B6jHL;A8B5jHK;;EAEE,uBAAA;EACA,2BAAA;E9B8jHP;A8BzjHG;EACE,gBAAA;E9B2jHL;A8BzjHK;;EAEE,gBAAA;EACA,uBAAA;EACA,+BAAA;EACA,qBAAA;E9B2jHP;A8BpjHG;;;EAGE,2BAAA;EACA,uBAAA;E9BsjHL;A8B/lHD;ELHE,aAAA;EACA,eAAA;EACA,kBAAA;EACA,2BAAA;EzBqmHD;A8BrmHD;EA0DI,iBAAA;E9B8iHH;A8BriHD;EACE,kCAAA;E9BuiHD;A8BxiHD;EAGI,aAAA;EAEA,qBAAA;E9BuiHH;A8B5iHD;EASM,mBAAA;EACA,yBAAA;EACA,+BAAA;EACA,4BAAA;E9BsiHL;A8BriHK;EACE,uCAAA;E9BuiHP;A8BjiHK;;;EAGE,gBAAA;EACA,2BAAA;EACA,2BAAA;EACA,kCAAA;EACA,iBAAA;E9BmiHP;A8B9hHC;EAqDA,aAAA;EA8BA,kBAAA;E9B+8GD;A8BliHC;EAwDE,aAAA;E9B6+GH;A8BriHC;EA0DI,oBAAA;EACA,oBAAA;E9B8+GL;A8BziHC;EAgEE,WAAA;EACA,YAAA;E9B4+GH;A8Bh+GD;EAAA;IAPM,qBAAA;IACA,WAAA;I9B2+GH;E8Br+GH;IAJQ,kBAAA;I9B4+GL;EACF;A8BtjHC;EAuFE,iBAAA;EACA,oBAAA;E9Bk+GH;A8B1jHC;;;EA8FE,2BAAA;E9Bi+GH;A8Bn9GD;EAAA;IATM,kCAAA;IACA,4BAAA;I9Bg+GH;E8Bx9GH;;;IAHM,8BAAA;I9Bg+GH;EACF;A8BjkHD;EAEI,aAAA;E9BkkHH;A8BpkHD;EAMM,oBAAA;E9BikHL;A8BvkHD;EASM,kBAAA;E9BikHL;A8B5jHK;;;EAGE,gBAAA;EACA,2BAAA;E9B8jHP;A8BtjHD;EAEI,aAAA;E9BujHH;A8BzjHD;EAIM,iBAAA;EACA,gBAAA;E9BwjHL;A8B5iHD;EACE,aAAA;E9B8iHD;A8B/iHD;EAII,aAAA;E9B8iHH;A8BljHD;EAMM,oBAAA;EACA,oBAAA;E9B+iHL;A8BtjHD;EAYI,WAAA;EACA,YAAA;E9B6iHH;A8BjiHD;EAAA;IAPM,qBAAA;IACA,WAAA;I9B4iHH;E8BtiHH;IAJQ,kBAAA;I9B6iHL;EACF;A8BriHD;EACE,kBAAA;E9BuiHD;A8BxiHD;EAKI,iBAAA;EACA,oBAAA;E9BsiHH;A8B5iHD;;;EAYI,2BAAA;E9BqiHH;A8BvhHD;EAAA;IATM,kCAAA;IACA,4BAAA;I9BoiHH;E8B5hHH;;;IAHM,8BAAA;I9BoiHH;EACF;A8B3hHD;EAEI,eAAA;EACA,oBAAA;E9B4hHH;A8B/hHD;EAMI,gBAAA;EACA,qBAAA;E9B4hHH;A8BnhHD;EAEE,kBAAA;EF7OA,4BAAA;EACC,2BAAA;E5BkwHF;A+B5vHD;EACE,oBAAA;EACA,kBAAA;EACA,qBAAA;EACA,+BAAA;E/B8vHD;A+BtvHD;EAAA;IAFI,oBAAA;I/B4vHD;EACF;A+B7uHD;EAAA;IAFI,aAAA;I/BmvHD;EACF;A+BruHD;EACE,qBAAA;EACA,qBAAA;EACA,oBAAA;EACA,mCAAA;EACA,4DAAA;UAAA,oDAAA;EAEA,mCAAA;E/BsuHD;A+BpuHC;EACE,kBAAA;E/BsuHH;A+BzsHD;EAAA;IAzBI,aAAA;IACA,eAAA;IACA,0BAAA;YAAA,kBAAA;I/BsuHD;E+BpuHC;IACE,2BAAA;IACA,gCAAA;IACA,yBAAA;IACA,mBAAA;IACA,8BAAA;I/BsuHH;E+BnuHC;IACE,qBAAA;I/BquHH;E+BhuHC;;;IAGE,iBAAA;IACA,kBAAA;I/BkuHH;EACF;A+B9tHD;;EAGI,mBAAA;E/B+tHH;A+B1tHC;EAAA;;IAFI,mBAAA;I/BiuHH;EACF;A+BxtHD;;;;EAII,qBAAA;EACA,oBAAA;E/B0tHH;A+BptHC;EAAA;;;;IAHI,iBAAA;IACA,gBAAA;I/B8tHH;EACF;A+BltHD;EACE,eAAA;EACA,uBAAA;E/BotHD;A+B/sHD;EAAA;IAFI,kBAAA;I/BqtHD;EACF;A+BjtHD;;EAEE,iBAAA;EACA,UAAA;EACA,SAAA;EACA,eAAA;E/BmtHD;A+B7sHD;EAAA;;IAFI,kBAAA;I/BotHD;EACF;A+BltHD;EACE,QAAA;EACA,uBAAA;E/BotHD;A+BltHD;EACE,WAAA;EACA,kBAAA;EACA,uBAAA;E/BotHD;A+B9sHD;EACE,aAAA;EACA,oBAAA;EACA,iBAAA;EACA,mBAAA;EACA,cAAA;E/BgtHD;A+B9sHC;;EAEE,uBAAA;E/BgtHH;A+BztHD;EAaI,gBAAA;E/B+sHH;A+BtsHD;EALI;;IAEE,oBAAA;I/B8sHH;EACF;A+BpsHD;EACE,oBAAA;EACA,cAAA;EACA,oBAAA;EACA,mBAAA;EC/LA,iBAAA;EACA,oBAAA;EDgMA,+BAAA;EACA,wBAAA;EACA,+BAAA;EACA,oBAAA;E/BusHD;A+BnsHC;EACE,YAAA;E/BqsHH;A+BntHD;EAmBI,gBAAA;EACA,aAAA;EACA,aAAA;EACA,oBAAA;E/BmsHH;A+BztHD;EAyBI,iBAAA;E/BmsHH;A+B7rHD;EAAA;IAFI,eAAA;I/BmsHD;EACF;A+B1rHD;EACE,qBAAA;E/B4rHD;A+B7rHD;EAII,mBAAA;EACA,sBAAA;EACA,mBAAA;E/B4rHH;A+BjqHC;EAAA;IArBI,kBAAA;IACA,aAAA;IACA,aAAA;IACA,eAAA;IACA,+BAAA;IACA,WAAA;IACA,0BAAA;YAAA,kBAAA;I/B0rHH;E+B3qHD;;IAZM,4BAAA;I/B2rHL;E+B/qHD;IATM,mBAAA;I/B2rHL;E+B1rHK;;IAEE,wBAAA;I/B4rHP;EACF;A+B1qHD;EAAA;IAXI,aAAA;IACA,WAAA;I/ByrHD;E+B/qHH;IAPM,aAAA;I/ByrHH;E+BlrHH;IALQ,mBAAA;IACA,sBAAA;I/B0rHL;EACF;A+B/qHD;EACE,oBAAA;EACA,qBAAA;EACA,oBAAA;EACA,mCAAA;EACA,sCAAA;E1B/NA,8FAAA;EACQ,sFAAA;E2B/DR,iBAAA;EACA,oBAAA;EhCi9HD;AkB/+GD;EAAA;IA/DM,uBAAA;IACA,kBAAA;IACA,wBAAA;IlBkjHH;EkBr/GH;IAxDM,uBAAA;IACA,aAAA;IACA,wBAAA;IlBgjHH;EkB1/GH;IAjDM,uBAAA;IlB8iHH;EkB7/GH;IA7CM,uBAAA;IACA,wBAAA;IlB6iHH;EkBjgHH;;;IAvCQ,aAAA;IlB6iHL;EkBtgHH;IAjCM,aAAA;IlB0iHH;EkBzgHH;IA7BM,kBAAA;IACA,wBAAA;IlByiHH;EkB7gHH;;IApBM,uBAAA;IACA,eAAA;IACA,kBAAA;IACA,wBAAA;IlBqiHH;EkBphHH;;IAdQ,iBAAA;IlBsiHL;EkBxhHH;;IATM,oBAAA;IACA,gBAAA;IlBqiHH;EkB7hHH;IAHM,QAAA;IlBmiHH;EACF;A+BxtHC;EAAA;IANI,oBAAA;I/BkuHH;E+BhuHG;IACE,kBAAA;I/BkuHL;EACF;A+BjtHD;EAAA;IARI,aAAA;IACA,WAAA;IACA,gBAAA;IACA,iBAAA;IACA,gBAAA;IACA,mBAAA;I1B1PF,0BAAA;IACQ,kBAAA;ILw9HP;EACF;A+BvtHD;EACE,eAAA;EHrUA,4BAAA;EACC,2BAAA;E5B+hIF;A+BvtHD;EHjUE,+BAAA;EACC,8BAAA;E5B2hIF;A+BltHD;EC/UE,iBAAA;EACA,oBAAA;EhCoiID;A+BntHC;EClVA,kBAAA;EACA,qBAAA;EhCwiID;A+BptHC;ECrVA,kBAAA;EACA,qBAAA;EhC4iID;A+B9sHD;EC/VE,kBAAA;EACA,qBAAA;EhCgjID;A+B1sHD;EAAA;IAJI,aAAA;IACA,mBAAA;IACA,oBAAA;I/BktHD;EACF;A+BzrHD;EAZE;IEvWA,wBAAA;IjCgjIC;E+BxsHD;IE3WA,yBAAA;IF6WE,qBAAA;I/B0sHD;E+B5sHD;IAKI,iBAAA;I/B0sHH;EACF;A+BjsHD;EACE,2BAAA;EACA,uBAAA;E/BmsHD;A+BrsHD;EAKI,gBAAA;E/BmsHH;A+BlsHG;;EAEE,gBAAA;EACA,+BAAA;E/BosHL;A+B7sHD;EAcI,gBAAA;E/BksHH;A+BhtHD;EAmBM,gBAAA;E/BgsHL;A+B9rHK;;EAEE,gBAAA;EACA,+BAAA;E/BgsHP;A+B5rHK;;;EAGE,gBAAA;EACA,2BAAA;E/B8rHP;A+B1rHK;;;EAGE,gBAAA;EACA,+BAAA;E/B4rHP;A+BpuHD;EA8CI,uBAAA;E/ByrHH;A+BxrHG;;EAEE,2BAAA;E/B0rHL;A+B3uHD;EAoDM,2BAAA;E/B0rHL;A+B9uHD;;EA0DI,uBAAA;E/BwrHH;A+BjrHK;;;EAGE,2BAAA;EACA,gBAAA;E/BmrHP;A+BlpHC;EAAA;IAzBQ,gBAAA;I/B+qHP;E+B9qHO;;IAEE,gBAAA;IACA,+BAAA;I/BgrHT;E+B5qHO;;;IAGE,gBAAA;IACA,2BAAA;I/B8qHT;E+B1qHO;;;IAGE,gBAAA;IACA,+BAAA;I/B4qHT;EACF;A+B9wHD;EA8GI,gBAAA;E/BmqHH;A+BlqHG;EACE,gBAAA;E/BoqHL;A+BpxHD;EAqHI,gBAAA;E/BkqHH;A+BjqHG;;EAEE,gBAAA;E/BmqHL;A+B/pHK;;;;EAEE,gBAAA;E/BmqHP;A+B3pHD;EACE,2BAAA;EACA,uBAAA;E/B6pHD;A+B/pHD;EAKI,gBAAA;E/B6pHH;A+B5pHG;;EAEE,gBAAA;EACA,+BAAA;E/B8pHL;A+BvqHD;EAcI,gBAAA;E/B4pHH;A+B1qHD;EAmBM,gBAAA;E/B0pHL;A+BxpHK;;EAEE,gBAAA;EACA,+BAAA;E/B0pHP;A+BtpHK;;;EAGE,gBAAA;EACA,2BAAA;E/BwpHP;A+BppHK;;;EAGE,gBAAA;EACA,+BAAA;E/BspHP;A+B9rHD;EA+CI,uBAAA;E/BkpHH;A+BjpHG;;EAEE,2BAAA;E/BmpHL;A+BrsHD;EAqDM,2BAAA;E/BmpHL;A+BxsHD;;EA2DI,uBAAA;E/BipHH;A+B3oHK;;;EAGE,2BAAA;EACA,gBAAA;E/B6oHP;A+BtmHC;EAAA;IA/BQ,uBAAA;I/ByoHP;E+B1mHD;IA5BQ,2BAAA;I/ByoHP;E+B7mHD;IAzBQ,gBAAA;I/ByoHP;E+BxoHO;;IAEE,gBAAA;IACA,+BAAA;I/B0oHT;E+BtoHO;;;IAGE,gBAAA;IACA,2BAAA;I/BwoHT;E+BpoHO;;;IAGE,gBAAA;IACA,+BAAA;I/BsoHT;EACF;A+B9uHD;EA+GI,gBAAA;E/BkoHH;A+BjoHG;EACE,gBAAA;E/BmoHL;A+BpvHD;EAsHI,gBAAA;E/BioHH;A+BhoHG;;EAEE,gBAAA;E/BkoHL;A+B9nHK;;;;EAEE,gBAAA;E/BkoHP;AkC3wID;EACE,mBAAA;EACA,qBAAA;EACA,kBAAA;EACA,2BAAA;EACA,oBAAA;ElC6wID;AkClxID;EAQI,uBAAA;ElC6wIH;AkCrxID;EAWM,mBAAA;EACA,gBAAA;EACA,gBAAA;ElC6wIL;AkC1xID;EAkBI,gBAAA;ElC2wIH;AmC/xID;EACE,uBAAA;EACA,iBAAA;EACA,gBAAA;EACA,oBAAA;EnCiyID;AmCryID;EAOI,iBAAA;EnCiyIH;AmCxyID;;EAUM,oBAAA;EACA,aAAA;EACA,mBAAA;EACA,yBAAA;EACA,uBAAA;EACA,gBAAA;EACA,2BAAA;EACA,2BAAA;EACA,mBAAA;EnCkyIL;AmChyIG;;EAGI,gBAAA;EPXN,gCAAA;EACG,6BAAA;E5B6yIJ;AmC/xIG;;EPvBF,iCAAA;EACG,8BAAA;E5B0zIJ;AmC1xIG;;;;EAEE,gBAAA;EACA,2BAAA;EACA,uBAAA;EnC8xIL;AmCxxIG;;;;;;EAGE,YAAA;EACA,gBAAA;EACA,2BAAA;EACA,uBAAA;EACA,iBAAA;EnC6xIL;AmCn1ID;;;;;;EAiEM,gBAAA;EACA,2BAAA;EACA,uBAAA;EACA,qBAAA;EnC0xIL;AmCjxID;;EC1EM,oBAAA;EACA,iBAAA;EpC+1IL;AoC71IG;;ERMF,gCAAA;EACG,6BAAA;E5B21IJ;AoC51IG;;ERRF,iCAAA;EACG,8BAAA;E5Bw2IJ;AmC3xID;;EC/EM,mBAAA;EACA,iBAAA;EpC82IL;AoC52IG;;ERMF,gCAAA;EACG,6BAAA;E5B02IJ;AoC32IG;;ERRF,iCAAA;EACG,8BAAA;E5Bu3IJ;AqC13ID;EACE,iBAAA;EACA,gBAAA;EACA,kBAAA;EACA,oBAAA;ErC43ID;AqCh4ID;EAOI,iBAAA;ErC43IH;AqCn4ID;;EAUM,uBAAA;EACA,mBAAA;EACA,2BAAA;EACA,2BAAA;EACA,qBAAA;ErC63IL;AqC34ID;;EAmBM,uBAAA;EACA,2BAAA;ErC43IL;AqCh5ID;;EA2BM,cAAA;ErCy3IL;AqCp5ID;;EAkCM,aAAA;ErCs3IL;AqCx5ID;;;;EA2CM,gBAAA;EACA,2BAAA;EACA,qBAAA;ErCm3IL;AsCj6ID;EACE,iBAAA;EACA,yBAAA;EACA,gBAAA;EACA,mBAAA;EACA,gBAAA;EACA,gBAAA;EACA,oBAAA;EACA,qBAAA;EACA,0BAAA;EACA,sBAAA;EtCm6ID;AsC/5IG;;EAEE,gBAAA;EACA,uBAAA;EACA,iBAAA;EtCi6IL;AsC55IC;EACE,eAAA;EtC85IH;AsC15IC;EACE,oBAAA;EACA,WAAA;EtC45IH;AsCr5ID;ECtCE,2BAAA;EvC87ID;AuC37IG;;EAEE,2BAAA;EvC67IL;AsCx5ID;EC1CE,2BAAA;EvCq8ID;AuCl8IG;;EAEE,2BAAA;EvCo8IL;AsC35ID;EC9CE,2BAAA;EvC48ID;AuCz8IG;;EAEE,2BAAA;EvC28IL;AsC95ID;EClDE,2BAAA;EvCm9ID;AuCh9IG;;EAEE,2BAAA;EvCk9IL;AsCj6ID;ECtDE,2BAAA;EvC09ID;AuCv9IG;;EAEE,2BAAA;EvCy9IL;AsCp6ID;EC1DE,2BAAA;EvCi+ID;AuC99IG;;EAEE,2BAAA;EvCg+IL;AwCl+ID;EACE,uBAAA;EACA,iBAAA;EACA,kBAAA;EACA,iBAAA;EACA,mBAAA;EACA,gBAAA;EACA,gBAAA;EACA,0BAAA;EACA,qBAAA;EACA,oBAAA;EACA,2BAAA;EACA,qBAAA;ExCo+ID;AwCj+IC;EACE,eAAA;ExCm+IH;AwC/9IC;EACE,oBAAA;EACA,WAAA;ExCi+IH;AwC/9IC;EACE,QAAA;EACA,kBAAA;ExCi+IH;AwC59IG;;EAEE,gBAAA;EACA,uBAAA;EACA,iBAAA;ExC89IL;AwCz9IC;;EAEE,gBAAA;EACA,2BAAA;ExC29IH;AwCz9IC;EACE,kBAAA;ExC29IH;AyC1gJD;EACE,oBAAA;EACA,qBAAA;EACA,gBAAA;EACA,2BAAA;EzC4gJD;AyChhJD;;EAQI,gBAAA;EzC4gJH;AyCphJD;EAWI,qBAAA;EACA,iBAAA;EACA,kBAAA;EzC4gJH;AyCzhJD;EAiBI,2BAAA;EzC2gJH;AyCxgJC;;EAEE,oBAAA;EzC0gJH;AyChiJD;EA0BI,iBAAA;EzCygJH;AyCz/ID;EAAA;IAZI,iBAAA;IzCygJD;EyCvgJC;IACE,oBAAA;IACA,qBAAA;IzCygJH;EyCjgJH;;IAHM,iBAAA;IzCwgJH;EACF;A0C/iJD;EACE,gBAAA;EACA,cAAA;EACA,qBAAA;EACA,yBAAA;EACA,2BAAA;EACA,2BAAA;EACA,oBAAA;ErCiLA,6CAAA;EACK,wCAAA;EACG,qCAAA;ELi4IT;A0C3jJD;;EAaI,mBAAA;EACA,oBAAA;E1CkjJH;A0C9iJC;;;EAGE,uBAAA;E1CgjJH;A0CrkJD;EA0BI,cAAA;EACA,gBAAA;E1C8iJH;A2CvkJD;EACE,eAAA;EACA,qBAAA;EACA,+BAAA;EACA,oBAAA;E3CykJD;A2C7kJD;EAQI,eAAA;EAEA,gBAAA;E3CukJH;A2CjlJD;EAcI,mBAAA;E3CskJH;A2CplJD;;EAoBI,kBAAA;E3CokJH;A2CxlJD;EAuBI,iBAAA;E3CokJH;A2C5jJD;;EAEE,qBAAA;E3C8jJD;A2ChkJD;;EAMI,oBAAA;EACA,WAAA;EACA,cAAA;EACA,gBAAA;E3C8jJH;A2CtjJD;ECrDE,2BAAA;EACA,uBAAA;EACA,gBAAA;E5C8mJD;A2C3jJD;EChDI,2BAAA;E5C8mJH;A2C9jJD;EC7CI,gBAAA;E5C8mJH;A2C9jJD;ECxDE,2BAAA;EACA,uBAAA;EACA,gBAAA;E5CynJD;A2CnkJD;ECnDI,2BAAA;E5CynJH;A2CtkJD;EChDI,gBAAA;E5CynJH;A2CtkJD;EC3DE,2BAAA;EACA,uBAAA;EACA,gBAAA;E5CooJD;A2C3kJD;ECtDI,2BAAA;E5CooJH;A2C9kJD;ECnDI,gBAAA;E5CooJH;A2C9kJD;EC9DE,2BAAA;EACA,uBAAA;EACA,gBAAA;E5C+oJD;A2CnlJD;ECzDI,2BAAA;E5C+oJH;A2CtlJD;ECtDI,gBAAA;E5C+oJH;A6CjpJD;EACE;IAAQ,6BAAA;I7CopJP;E6CnpJD;IAAQ,0BAAA;I7CspJP;EACF;A6CnpJD;EACE;IAAQ,6BAAA;I7CspJP;E6CrpJD;IAAQ,0BAAA;I7CwpJP;EACF;A6C3pJD;EACE;IAAQ,6BAAA;I7CspJP;E6CrpJD;IAAQ,0BAAA;I7CwpJP;EACF;A6CjpJD;EACE,kBAAA;EACA,cAAA;EACA,qBAAA;EACA,2BAAA;EACA,oBAAA;ExCsCA,wDAAA;EACQ,gDAAA;EL8mJT;A6ChpJD;EACE,aAAA;EACA,WAAA;EACA,cAAA;EACA,iBAAA;EACA,mBAAA;EACA,gBAAA;EACA,oBAAA;EACA,2BAAA;ExCyBA,wDAAA;EACQ,gDAAA;EAyHR,qCAAA;EACK,gCAAA;EACG,6BAAA;ELkgJT;A6C7oJD;;ECCI,+MAAA;EACA,0MAAA;EACA,uMAAA;EDAF,oCAAA;UAAA,4BAAA;E7CipJD;A6C1oJD;;ExC5CE,4DAAA;EACK,uDAAA;EACG,oDAAA;EL0rJT;A6CvoJD;EErEE,2BAAA;E/C+sJD;A+C5sJC;EDgDE,+MAAA;EACA,0MAAA;EACA,uMAAA;E9C+pJH;A6C3oJD;EEzEE,2BAAA;E/CutJD;A+CptJC;EDgDE,+MAAA;EACA,0MAAA;EACA,uMAAA;E9CuqJH;A6C/oJD;EE7EE,2BAAA;E/C+tJD;A+C5tJC;EDgDE,+MAAA;EACA,0MAAA;EACA,uMAAA;E9C+qJH;A6CnpJD;EEjFE,2BAAA;E/CuuJD;A+CpuJC;EDgDE,+MAAA;EACA,0MAAA;EACA,uMAAA;E9CurJH;AgD/uJD;EAEE,kBAAA;EhDgvJD;AgD9uJC;EACE,eAAA;EhDgvJH;AgD5uJD;;EAEE,oBAAA;EhD8uJD;AgD3uJD;;EAEE,qBAAA;EhD6uJD;AgD1uJD;;;EAGE,qBAAA;EACA,qBAAA;EhD4uJD;AgDzuJD;EACE,wBAAA;EhD2uJD;AgDxuJD;EACE,wBAAA;EhD0uJD;AgDtuJD;EACE,eAAA;EACA,oBAAA;EhDwuJD;AgDluJD;EACE,iBAAA;EACA,kBAAA;EhDouJD;AiDxwJD;EAEE,qBAAA;EACA,iBAAA;EjDywJD;AiDjwJD;EACE,oBAAA;EACA,gBAAA;EACA,oBAAA;EAEA,qBAAA;EACA,2BAAA;EACA,2BAAA;EjDkwJD;AiD/vJC;ErB3BA,8BAAA;EACC,6BAAA;E5B6xJF;AiDhwJC;EACE,kBAAA;ErBvBF,iCAAA;EACC,gCAAA;E5B0xJF;AiDlxJD;EAoBI,cAAA;EjDiwJH;AiDrxJD;EAuBI,mBAAA;EjDiwJH;AiDvvJD;EACE,gBAAA;EjDyvJD;AiD1vJD;EAII,gBAAA;EjDyvJH;AiDrvJC;;EAEE,uBAAA;EACA,gBAAA;EACA,2BAAA;EjDuvJH;AiDjvJC;;;EAGE,2BAAA;EACA,gBAAA;EACA,qBAAA;EjDmvJH;AiDxvJC;;;EASI,gBAAA;EjDovJL;AiD7vJC;;;EAYI,gBAAA;EjDsvJL;AiDjvJC;;;EAGE,YAAA;EACA,gBAAA;EACA,2BAAA;EACA,uBAAA;EjDmvJH;AiDzvJC;;;;;;;;;EAYI,gBAAA;EjDwvJL;AiDpwJC;;;EAeI,gBAAA;EjD0vJL;AkD91JC;EACE,gBAAA;EACA,2BAAA;ElDg2JH;AkD91JG;EACE,gBAAA;ElDg2JL;AkDj2JG;EAII,gBAAA;ElDg2JP;AkD71JK;;EAEE,gBAAA;EACA,2BAAA;ElD+1JP;AkD71JK;;;EAGE,aAAA;EACA,2BAAA;EACA,uBAAA;ElD+1JP;AkDp3JC;EACE,gBAAA;EACA,2BAAA;ElDs3JH;AkDp3JG;EACE,gBAAA;ElDs3JL;AkDv3JG;EAII,gBAAA;ElDs3JP;AkDn3JK;;EAEE,gBAAA;EACA,2BAAA;ElDq3JP;AkDn3JK;;;EAGE,aAAA;EACA,2BAAA;EACA,uBAAA;ElDq3JP;AkD14JC;EACE,gBAAA;EACA,2BAAA;ElD44JH;AkD14JG;EACE,gBAAA;ElD44JL;AkD74JG;EAII,gBAAA;ElD44JP;AkDz4JK;;EAEE,gBAAA;EACA,2BAAA;ElD24JP;AkDz4JK;;;EAGE,aAAA;EACA,2BAAA;EACA,uBAAA;ElD24JP;AkDh6JC;EACE,gBAAA;EACA,2BAAA;ElDk6JH;AkDh6JG;EACE,gBAAA;ElDk6JL;AkDn6JG;EAII,gBAAA;ElDk6JP;AkD/5JK;;EAEE,gBAAA;EACA,2BAAA;ElDi6JP;AkD/5JK;;;EAGE,aAAA;EACA,2BAAA;EACA,uBAAA;ElDi6JP;AiD7zJD;EACE,eAAA;EACA,oBAAA;EjD+zJD;AiD7zJD;EACE,kBAAA;EACA,kBAAA;EjD+zJD;AmD37JD;EACE,qBAAA;EACA,2BAAA;EACA,+BAAA;EACA,oBAAA;E9C0DA,mDAAA;EACQ,2CAAA;ELo4JT;AmD17JD;EACE,eAAA;EnD47JD;AmDv7JD;EACE,oBAAA;EACA,sCAAA;EvBpBA,8BAAA;EACC,6BAAA;E5B88JF;AmD77JD;EAMI,gBAAA;EnD07JH;AmDr7JD;EACE,eAAA;EACA,kBAAA;EACA,iBAAA;EACA,gBAAA;EnDu7JD;AmD37JD;EAOI,gBAAA;EnDu7JH;AmDl7JD;EACE,oBAAA;EACA,2BAAA;EACA,+BAAA;EvBpCA,iCAAA;EACC,gCAAA;E5By9JF;AmD56JD;;EAGI,kBAAA;EnD66JH;AmDh7JD;;EAMM,qBAAA;EACA,kBAAA;EnD86JL;AmD16JG;;EAEI,eAAA;EvBnEN,8BAAA;EACC,6BAAA;E5Bg/JF;AmDz6JG;;EAEI,kBAAA;EvBlEN,iCAAA;EACC,gCAAA;E5B8+JF;AmDt6JD;EAEI,qBAAA;EnDu6JH;AmDp6JD;EACE,qBAAA;EnDs6JD;AmD95JD;;;EAII,kBAAA;EnD+5JH;AmDn6JD;;;EAOM,oBAAA;EACA,qBAAA;EnDi6JL;AmDz6JD;;EvB/FE,8BAAA;EACC,6BAAA;E5B4gKF;AmD96JD;;;;EAmBQ,6BAAA;EACA,8BAAA;EnDi6JP;AmDr7JD;;;;;;;;EAwBU,6BAAA;EnDu6JT;AmD/7JD;;;;;;;;EA4BU,8BAAA;EnD66JT;AmDz8JD;;EvBvFE,iCAAA;EACC,gCAAA;E5BoiKF;AmD98JD;;;;EAyCQ,gCAAA;EACA,iCAAA;EnD26JP;AmDr9JD;;;;;;;;EA8CU,gCAAA;EnDi7JT;AmD/9JD;;;;;;;;EAkDU,iCAAA;EnDu7JT;AmDz+JD;;;;EA2DI,+BAAA;EnDo7JH;AmD/+JD;;EA+DI,eAAA;EnDo7JH;AmDn/JD;;EAmEI,WAAA;EnDo7JH;AmDv/JD;;;;;;;;;;;;EA0EU,gBAAA;EnD27JT;AmDrgKD;;;;;;;;;;;;EA8EU,iBAAA;EnDq8JT;AmDnhKD;;;;;;;;EAuFU,kBAAA;EnDs8JT;AmD7hKD;;;;;;;;EAgGU,kBAAA;EnDu8JT;AmDviKD;EAsGI,WAAA;EACA,kBAAA;EnDo8JH;AmD17JD;EACE,qBAAA;EnD47JD;AmD77JD;EAKI,kBAAA;EACA,oBAAA;EnD27JH;AmDj8JD;EASM,iBAAA;EnD27JL;AmDp8JD;EAcI,kBAAA;EnDy7JH;AmDv8JD;;EAkBM,+BAAA;EnDy7JL;AmD38JD;EAuBI,eAAA;EnDu7JH;AmD98JD;EAyBM,kCAAA;EnDw7JL;AmDj7JD;EChPE,uBAAA;EpDoqKD;AoDlqKC;EACE,gBAAA;EACA,2BAAA;EACA,uBAAA;EpDoqKH;AoDvqKC;EAMI,2BAAA;EpDoqKL;AoD1qKC;EASI,gBAAA;EACA,2BAAA;EpDoqKL;AoDjqKC;EAEI,8BAAA;EpDkqKL;AmDh8JD;ECnPE,uBAAA;EpDsrKD;AoDprKC;EACE,gBAAA;EACA,2BAAA;EACA,uBAAA;EpDsrKH;AoDzrKC;EAMI,2BAAA;EpDsrKL;AoD5rKC;EASI,gBAAA;EACA,2BAAA;EpDsrKL;AoDnrKC;EAEI,8BAAA;EpDorKL;AmD/8JD;ECtPE,uBAAA;EpDwsKD;AoDtsKC;EACE,gBAAA;EACA,2BAAA;EACA,uBAAA;EpDwsKH;AoD3sKC;EAMI,2BAAA;EpDwsKL;AoD9sKC;EASI,gBAAA;EACA,2BAAA;EpDwsKL;AoDrsKC;EAEI,8BAAA;EpDssKL;AmD99JD;ECzPE,uBAAA;EpD0tKD;AoDxtKC;EACE,gBAAA;EACA,2BAAA;EACA,uBAAA;EpD0tKH;AoD7tKC;EAMI,2BAAA;EpD0tKL;AoDhuKC;EASI,gBAAA;EACA,2BAAA;EpD0tKL;AoDvtKC;EAEI,8BAAA;EpDwtKL;AmD7+JD;EC5PE,uBAAA;EpD4uKD;AoD1uKC;EACE,gBAAA;EACA,2BAAA;EACA,uBAAA;EpD4uKH;AoD/uKC;EAMI,2BAAA;EpD4uKL;AoDlvKC;EASI,gBAAA;EACA,2BAAA;EpD4uKL;AoDzuKC;EAEI,8BAAA;EpD0uKL;AmD5/JD;EC/PE,uBAAA;EpD8vKD;AoD5vKC;EACE,gBAAA;EACA,2BAAA;EACA,uBAAA;EpD8vKH;AoDjwKC;EAMI,2BAAA;EpD8vKL;AoDpwKC;EASI,gBAAA;EACA,2BAAA;EpD8vKL;AoD3vKC;EAEI,8BAAA;EpD4vKL;AqD5wKD;EACE,oBAAA;EACA,gBAAA;EACA,WAAA;EACA,YAAA;EACA,kBAAA;ErD8wKD;AqDnxKD;;;;;EAYI,oBAAA;EACA,QAAA;EACA,SAAA;EACA,WAAA;EACA,cAAA;EACA,aAAA;EACA,WAAA;ErD8wKH;AqD1wKC;EACE,wBAAA;ErD4wKH;AqDxwKC;EACE,qBAAA;ErD0wKH;AsDpyKD;EACE,kBAAA;EACA,eAAA;EACA,qBAAA;EACA,2BAAA;EACA,2BAAA;EACA,oBAAA;EjDwDA,yDAAA;EACQ,iDAAA;EL+uKT;AsD9yKD;EASI,oBAAA;EACA,mCAAA;EtDwyKH;AsDnyKD;EACE,eAAA;EACA,oBAAA;EtDqyKD;AsDnyKD;EACE,cAAA;EACA,oBAAA;EtDqyKD;AuD3zKD;EACE,cAAA;EACA,iBAAA;EACA,mBAAA;EACA,gBAAA;EACA,gBAAA;EACA,8BAAA;EjCRA,cAAA;EAGA,2BAAA;EtBo0KD;AuD5zKC;;EAEE,gBAAA;EACA,uBAAA;EACA,iBAAA;EjCfF,cAAA;EAGA,2BAAA;EtB40KD;AuDzzKC;EACE,YAAA;EACA,iBAAA;EACA,yBAAA;EACA,WAAA;EACA,0BAAA;EvD2zKH;AwD/0KD;EACE,kBAAA;ExDi1KD;AwD70KD;EACE,eAAA;EACA,kBAAA;EACA,iBAAA;EACA,QAAA;EACA,UAAA;EACA,WAAA;EACA,SAAA;EACA,eAAA;EACA,mCAAA;EAIA,YAAA;ExD40KD;AwDz0KC;EnD+GA,uCAAA;EACI,mCAAA;EACC,kCAAA;EACG,+BAAA;EAkER,qDAAA;EAEK,2CAAA;EACG,qCAAA;EL4pKT;AwD/0KC;EnD2GA,oCAAA;EACI,gCAAA;EACC,+BAAA;EACG,4BAAA;ELuuKT;AwDn1KD;EACE,oBAAA;EACA,kBAAA;ExDq1KD;AwDj1KD;EACE,oBAAA;EACA,aAAA;EACA,cAAA;ExDm1KD;AwD/0KD;EACE,oBAAA;EACA,2BAAA;EACA,2BAAA;EACA,sCAAA;EACA,oBAAA;EnDaA,kDAAA;EACQ,0CAAA;EmDZR,sCAAA;UAAA,8BAAA;EAEA,YAAA;ExDi1KD;AwD70KD;EACE,iBAAA;EACA,QAAA;EACA,UAAA;EACA,WAAA;EACA,SAAA;EACA,2BAAA;ExD+0KD;AwD70KC;ElCpEA,YAAA;EAGA,0BAAA;EtBk5KD;AwDh1KC;ElCrEA,cAAA;EAGA,2BAAA;EtBs5KD;AwD/0KD;EACE,eAAA;EACA,kCAAA;EACA,2BAAA;ExDi1KD;AwD90KD;EACE,kBAAA;ExDg1KD;AwD50KD;EACE,WAAA;EACA,yBAAA;ExD80KD;AwDz0KD;EACE,oBAAA;EACA,eAAA;ExD20KD;AwDv0KD;EACE,eAAA;EACA,mBAAA;EACA,+BAAA;ExDy0KD;AwD50KD;EAQI,kBAAA;EACA,kBAAA;ExDu0KH;AwDh1KD;EAaI,mBAAA;ExDs0KH;AwDn1KD;EAiBI,gBAAA;ExDq0KH;AwDh0KD;EACE,oBAAA;EACA,cAAA;EACA,aAAA;EACA,cAAA;EACA,kBAAA;ExDk0KD;AwDhzKD;EAZE;IACE,cAAA;IACA,mBAAA;IxD+zKD;EwD7zKD;InDtEA,mDAAA;IACQ,2CAAA;ILs4KP;EwD5zKD;IAAY,cAAA;IxD+zKX;EACF;AwD1zKD;EAFE;IAAY,cAAA;IxDg0KX;EACF;AyD98KD;EACE,oBAAA;EACA,eAAA;EACA,gBAAA;EACA,qBAAA;EACA,iBAAA;EACA,kBAAA;EnCTA,YAAA;EAGA,0BAAA;EtBw9KD;AyD/8KC;EnCZA,cAAA;EAGA,2BAAA;EtB49KD;AyDl9KC;EAAW,kBAAA;EAAmB,gBAAA;EzDs9K/B;AyDr9KC;EAAW,kBAAA;EAAmB,gBAAA;EzDy9K/B;AyDx9KC;EAAW,iBAAA;EAAmB,gBAAA;EzD49K/B;AyD39KC;EAAW,mBAAA;EAAmB,gBAAA;EzD+9K/B;AyD39KD;EACE,kBAAA;EACA,kBAAA;EACA,gBAAA;EACA,oBAAA;EACA,uBAAA;EACA,2BAAA;EACA,oBAAA;EzD69KD;AyDz9KD;EACE,oBAAA;EACA,UAAA;EACA,WAAA;EACA,2BAAA;EACA,qBAAA;EzD29KD;AyDx9KC;EACE,WAAA;EACA,WAAA;EACA,mBAAA;EACA,yBAAA;EACA,2BAAA;EzD09KH;AyDx9KC;EACE,WAAA;EACA,WAAA;EACA,yBAAA;EACA,2BAAA;EzD09KH;AyDx9KC;EACE,WAAA;EACA,YAAA;EACA,yBAAA;EACA,2BAAA;EzD09KH;AyDx9KC;EACE,UAAA;EACA,SAAA;EACA,kBAAA;EACA,6BAAA;EACA,6BAAA;EzD09KH;AyDx9KC;EACE,UAAA;EACA,UAAA;EACA,kBAAA;EACA,6BAAA;EACA,4BAAA;EzD09KH;AyDx9KC;EACE,QAAA;EACA,WAAA;EACA,mBAAA;EACA,yBAAA;EACA,8BAAA;EzD09KH;AyDx9KC;EACE,QAAA;EACA,WAAA;EACA,yBAAA;EACA,8BAAA;EzD09KH;AyDx9KC;EACE,QAAA;EACA,YAAA;EACA,yBAAA;EACA,8BAAA;EzD09KH;A0DjjLD;EACE,oBAAA;EACA,QAAA;EACA,SAAA;EACA,eAAA;EACA,eAAA;EACA,kBAAA;EACA,cAAA;EAEA,iBAAA;EACA,qBAAA;EACA,yBAAA;EACA,kBAAA;EACA,2BAAA;EACA,sCAAA;UAAA,8BAAA;EACA,2BAAA;EACA,sCAAA;EACA,oBAAA;ErD8CA,mDAAA;EACQ,2CAAA;EqD3CR,qBAAA;E1DijLD;A0D9iLC;EAAY,mBAAA;E1DijLb;A0DhjLC;EAAY,mBAAA;E1DmjLb;A0DljLC;EAAY,kBAAA;E1DqjLb;A0DpjLC;EAAY,oBAAA;E1DujLb;A0DpjLD;EACE,WAAA;EACA,mBAAA;EACA,iBAAA;EACA,2BAAA;EACA,kCAAA;EACA,4BAAA;E1DsjLD;A0DnjLD;EACE,mBAAA;E1DqjLD;A0D7iLC;;EAEE,oBAAA;EACA,gBAAA;EACA,UAAA;EACA,WAAA;EACA,2BAAA;EACA,qBAAA;E1D+iLH;A0D5iLD;EACE,oBAAA;E1D8iLD;A0D5iLD;EACE,oBAAA;EACA,aAAA;E1D8iLD;A0D1iLC;EACE,WAAA;EACA,oBAAA;EACA,wBAAA;EACA,2BAAA;EACA,uCAAA;EACA,eAAA;E1D4iLH;A0D3iLG;EACE,cAAA;EACA,aAAA;EACA,oBAAA;EACA,wBAAA;EACA,2BAAA;E1D6iLL;A0D1iLC;EACE,UAAA;EACA,aAAA;EACA,mBAAA;EACA,sBAAA;EACA,6BAAA;EACA,yCAAA;E1D4iLH;A0D3iLG;EACE,cAAA;EACA,WAAA;EACA,eAAA;EACA,sBAAA;EACA,6BAAA;E1D6iLL;A0D1iLC;EACE,WAAA;EACA,oBAAA;EACA,qBAAA;EACA,8BAAA;EACA,0CAAA;EACA,YAAA;E1D4iLH;A0D3iLG;EACE,cAAA;EACA,UAAA;EACA,oBAAA;EACA,qBAAA;EACA,8BAAA;E1D6iLL;A0DziLC;EACE,UAAA;EACA,cAAA;EACA,mBAAA;EACA,uBAAA;EACA,4BAAA;EACA,wCAAA;E1D2iLH;A0D1iLG;EACE,cAAA;EACA,YAAA;EACA,uBAAA;EACA,4BAAA;EACA,eAAA;E1D4iLL;A2DxqLD;EACE,oBAAA;E3D0qLD;A2DvqLD;EACE,oBAAA;EACA,kBAAA;EACA,aAAA;E3DyqLD;A2D5qLD;EAMI,eAAA;EACA,oBAAA;EtD6KF,2CAAA;EACK,sCAAA;EACG,mCAAA;EL6/KT;A2DnrLD;;EAcM,gBAAA;E3DyqLL;A2D/oLC;EAAA;IArBI,wDAAA;SAAA,8CAAA;YAAA,wCAAA;IACA,qCAAA;YAAA,6BAAA;IACA,2BAAA;YAAA,mBAAA;I3DwqLH;E2DtqLG;;IAEE,4CAAA;YAAA,oCAAA;IACA,SAAA;I3DwqLL;E2DtqLG;;IAEE,6CAAA;YAAA,qCAAA;IACA,SAAA;I3DwqLL;E2DtqLG;;;IAGE,yCAAA;YAAA,iCAAA;IACA,SAAA;I3DwqLL;EACF;A2D9sLD;;;EA6CI,gBAAA;E3DsqLH;A2DntLD;EAiDI,SAAA;E3DqqLH;A2DttLD;;EAsDI,oBAAA;EACA,QAAA;EACA,aAAA;E3DoqLH;A2D5tLD;EA4DI,YAAA;E3DmqLH;A2D/tLD;EA+DI,aAAA;E3DmqLH;A2DluLD;;EAmEI,SAAA;E3DmqLH;A2DtuLD;EAuEI,aAAA;E3DkqLH;A2DzuLD;EA0EI,YAAA;E3DkqLH;A2D1pLD;EACE,oBAAA;EACA,QAAA;EACA,SAAA;EACA,WAAA;EACA,YAAA;ErC9FA,cAAA;EAGA,2BAAA;EqC6FA,iBAAA;EACA,gBAAA;EACA,oBAAA;EACA,2CAAA;E3D6pLD;A2DxpLC;EblGE,oGAAA;EACA,+FAAA;EACA,sHAAA;EAAA,gGAAA;EACA,6BAAA;EACA,wHAAA;E9C6vLH;A2D5pLC;EACE,YAAA;EACA,UAAA;EbvGA,oGAAA;EACA,+FAAA;EACA,sHAAA;EAAA,gGAAA;EACA,6BAAA;EACA,wHAAA;E9CswLH;A2D9pLC;;EAEE,YAAA;EACA,gBAAA;EACA,uBAAA;ErCtHF,cAAA;EAGA,2BAAA;EtBqxLD;A2D/rLD;;;;EAsCI,oBAAA;EACA,UAAA;EACA,YAAA;EACA,uBAAA;E3D+pLH;A2DxsLD;;EA6CI,WAAA;EACA,oBAAA;E3D+pLH;A2D7sLD;;EAkDI,YAAA;EACA,qBAAA;E3D+pLH;A2DltLD;;EAuDI,aAAA;EACA,cAAA;EACA,mBAAA;EACA,oBAAA;E3D+pLH;A2D1pLG;EACE,kBAAA;E3D4pLL;A2DxpLG;EACE,kBAAA;E3D0pLL;A2DhpLD;EACE,oBAAA;EACA,cAAA;EACA,WAAA;EACA,aAAA;EACA,YAAA;EACA,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,oBAAA;E3DkpLD;A2D3pLD;EAYI,uBAAA;EACA,aAAA;EACA,cAAA;EACA,aAAA;EACA,qBAAA;EACA,2BAAA;EACA,qBAAA;EACA,iBAAA;EAUA,2BAAA;EACA,oCAAA;E3DyoLH;A2DvqLD;EAiCI,WAAA;EACA,aAAA;EACA,cAAA;EACA,2BAAA;E3DyoLH;A2DloLD;EACE,oBAAA;EACA,WAAA;EACA,YAAA;EACA,cAAA;EACA,aAAA;EACA,mBAAA;EACA,sBAAA;EACA,gBAAA;EACA,oBAAA;EACA,2CAAA;E3DooLD;A2DnoLC;EACE,mBAAA;E3DqoLH;A2D5lLD;EAhCE;;;;IAKI,aAAA;IACA,cAAA;IACA,mBAAA;IACA,iBAAA;I3D8nLH;E2DtoLD;;IAYI,oBAAA;I3D8nLH;E2D1oLD;;IAgBI,qBAAA;I3D8nLH;E2DznLD;IACE,WAAA;IACA,YAAA;IACA,sBAAA;I3D2nLD;E2DvnLD;IACE,cAAA;I3DynLD;EACF;A4Dr3LC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE,cAAA;EACA,gBAAA;E5Dm5LH;A4Dj5LC;;;;;;;;;;;;;;;EACE,aAAA;E5Di6LH;AiCz6LD;E4BRE,gBAAA;EACA,mBAAA;EACA,oBAAA;E7Do7LD;AiC36LD;EACE,yBAAA;EjC66LD;AiC36LD;EACE,wBAAA;EjC66LD;AiCr6LD;EACE,0BAAA;EjCu6LD;AiCr6LD;EACE,2BAAA;EjCu6LD;AiCr6LD;EACE,oBAAA;EjCu6LD;AiCr6LD;E6BzBE,aAAA;EACA,oBAAA;EACA,mBAAA;EACA,+BAAA;EACA,WAAA;E9Di8LD;AiCn6LD;EACE,0BAAA;EACA,+BAAA;EjCq6LD;AiC95LD;EACE,iBAAA;EjCg6LD;A+Dl8LD;EACE,qBAAA;E/Do8LD;A+D97LD;;;;ECdE,0BAAA;EhEk9LD;A+D77LD;;;;;;;;;;;;EAYE,0BAAA;E/D+7LD;A+Dx7LD;EAAA;IChDE,2BAAA;IhE4+LC;EgE3+LD;IAAU,gBAAA;IhE8+LT;EgE7+LD;IAAU,+BAAA;IhEg/LT;EgE/+LD;;IACU,gCAAA;IhEk/LT;EACF;A+Dl8LD;EAAA;IAFI,2BAAA;I/Dw8LD;EACF;A+Dl8LD;EAAA;IAFI,4BAAA;I/Dw8LD;EACF;A+Dl8LD;EAAA;IAFI,kCAAA;I/Dw8LD;EACF;A+Dj8LD;EAAA;ICrEE,2BAAA;IhE0gMC;EgEzgMD;IAAU,gBAAA;IhE4gMT;EgE3gMD;IAAU,+BAAA;IhE8gMT;EgE7gMD;;IACU,gCAAA;IhEghMT;EACF;A+D38LD;EAAA;IAFI,2BAAA;I/Di9LD;EACF;A+D38LD;EAAA;IAFI,4BAAA;I/Di9LD;EACF;A+D38LD;EAAA;IAFI,kCAAA;I/Di9LD;EACF;A+D18LD;EAAA;IC1FE,2BAAA;IhEwiMC;EgEviMD;IAAU,gBAAA;IhE0iMT;EgEziMD;IAAU,+BAAA;IhE4iMT;EgE3iMD;;IACU,gCAAA;IhE8iMT;EACF;A+Dp9LD;EAAA;IAFI,2BAAA;I/D09LD;EACF;A+Dp9LD;EAAA;IAFI,4BAAA;I/D09LD;EACF;A+Dp9LD;EAAA;IAFI,kCAAA;I/D09LD;EACF;A+Dn9LD;EAAA;IC/GE,2BAAA;IhEskMC;EgErkMD;IAAU,gBAAA;IhEwkMT;EgEvkMD;IAAU,+BAAA;IhE0kMT;EgEzkMD;;IACU,gCAAA;IhE4kMT;EACF;A+D79LD;EAAA;IAFI,2BAAA;I/Dm+LD;EACF;A+D79LD;EAAA;IAFI,4BAAA;I/Dm+LD;EACF;A+D79LD;EAAA;IAFI,kCAAA;I/Dm+LD;EACF;A+D59LD;EAAA;IC5HE,0BAAA;IhE4lMC;EACF;A+D59LD;EAAA;ICjIE,0BAAA;IhEimMC;EACF;A+D59LD;EAAA;ICtIE,0BAAA;IhEsmMC;EACF;A+D59LD;EAAA;IC3IE,0BAAA;IhE2mMC;EACF;A+Dz9LD;ECnJE,0BAAA;EhE+mMD;A+Dt9LD;EAAA;ICjKE,2BAAA;IhE2nMC;EgE1nMD;IAAU,gBAAA;IhE6nMT;EgE5nMD;IAAU,+BAAA;IhE+nMT;EgE9nMD;;IACU,gCAAA;IhEioMT;EACF;A+Dp+LD;EACE,0BAAA;E/Ds+LD;A+Dj+LD;EAAA;IAFI,2BAAA;I/Du+LD;EACF;A+Dr+LD;EACE,0BAAA;E/Du+LD;A+Dl+LD;EAAA;IAFI,4BAAA;I/Dw+LD;EACF;A+Dt+LD;EACE,0BAAA;E/Dw+LD;A+Dn+LD;EAAA;IAFI,kCAAA;I/Dy+LD;EACF;A+Dl+LD;EAAA;ICpLE,0BAAA;IhE0pMC;EACF","file":"bootstrap.css","sourcesContent":["/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: 1px dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n -moz-box-sizing: content-box;\n -webkit-box-sizing: content-box;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important;\n box-shadow: none !important;\n text-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n select {\n background: #fff !important;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('../fonts/glyphicons-halflings-regular.eot');\n src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\2a\";\n}\n.glyphicon-plus:before {\n content: \"\\2b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #ffffff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #428bca;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #2a6496;\n text-decoration: underline;\n}\na:focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n background-color: #fcf8e3;\n padding: .2em;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #428bca;\n}\na.text-primary:hover {\n color: #3071a9;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #428bca;\n}\na.bg-primary:hover {\n background-color: #3071a9;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777777;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: '\\00A0 \\2014';\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #ffffff;\n background-color: #333333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n word-break: break-all;\n word-wrap: break-word;\n color: #333333;\n background-color: #f5f5f5;\n border: 1px solid #cccccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n.row {\n margin-left: -15px;\n margin-right: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #dddddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #dddddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #dddddd;\n}\n.table .table {\n background-color: #ffffff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #dddddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #dddddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-child(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #dddddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n min-width: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #ffffff;\n background-image: none;\n border: 1px solid #cccccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999999;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n background-color: #eeeeee;\n opacity: 1;\n}\ntextarea.form-control {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n line-height: 34px;\n line-height: 1.42857143 \\0;\n}\ninput[type=\"date\"].input-sm,\ninput[type=\"time\"].input-sm,\ninput[type=\"datetime-local\"].input-sm,\ninput[type=\"month\"].input-sm {\n line-height: 30px;\n line-height: 1.5 \\0;\n}\ninput[type=\"date\"].input-lg,\ninput[type=\"time\"].input-lg,\ninput[type=\"datetime-local\"].input-lg,\ninput[type=\"month\"].input-lg {\n line-height: 46px;\n line-height: 1.33 \\0;\n}\n_:-ms-fullscreen,\n:root input[type=\"date\"],\n_:-ms-fullscreen,\n:root input[type=\"time\"],\n_:-ms-fullscreen,\n:root input[type=\"datetime-local\"],\n_:-ms-fullscreen,\n:root input[type=\"month\"] {\n line-height: 1.42857143;\n}\n_:-ms-fullscreen.input-sm,\n:root input[type=\"date\"].input-sm,\n_:-ms-fullscreen.input-sm,\n:root input[type=\"time\"].input-sm,\n_:-ms-fullscreen.input-sm,\n:root input[type=\"datetime-local\"].input-sm,\n_:-ms-fullscreen.input-sm,\n:root input[type=\"month\"].input-sm {\n line-height: 1.5;\n}\n_:-ms-fullscreen.input-lg,\n:root input[type=\"date\"].input-lg,\n_:-ms-fullscreen.input-lg,\n:root input[type=\"time\"].input-lg,\n_:-ms-fullscreen.input-lg,\n:root input[type=\"datetime-local\"].input-lg,\n_:-ms-fullscreen.input-lg,\n:root input[type=\"month\"].input-lg {\n line-height: 1.33;\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.form-control-static {\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-left: 0;\n padding-right: 0;\n}\n.input-sm,\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm,\nselect.form-group-sm .form-control {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\ntextarea.form-group-sm .form-control,\nselect[multiple].input-sm,\nselect[multiple].form-group-sm .form-control {\n height: auto;\n}\n.input-lg,\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.33;\n border-radius: 6px;\n}\nselect.input-lg,\nselect.form-group-lg .form-control {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\ntextarea.form-group-lg .form-control,\nselect[multiple].input-lg,\nselect[multiple].form-group-lg .form-control {\n height: auto;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n border-color: #3c763d;\n background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n border-color: #8a6d3b;\n background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n border-color: #a94442;\n background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-left: -15px;\n margin-right: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: 7px;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 14.3px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n white-space: nowrap;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: thin dotted;\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n outline: 0;\n background-image: none;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n pointer-events: none;\n opacity: 0.65;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default {\n color: #333333;\n background-color: #ffffff;\n border-color: #cccccc;\n}\n.btn-default:hover,\n.btn-default:focus,\n.btn-default.focus,\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n background-image: none;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #ffffff;\n border-color: #cccccc;\n}\n.btn-default .badge {\n color: #ffffff;\n background-color: #333333;\n}\n.btn-primary {\n color: #ffffff;\n background-color: #428bca;\n border-color: #357ebd;\n}\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary.focus,\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #ffffff;\n background-color: #3071a9;\n border-color: #285e8e;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n background-image: none;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #428bca;\n border-color: #357ebd;\n}\n.btn-primary .badge {\n color: #428bca;\n background-color: #ffffff;\n}\n.btn-success {\n color: #ffffff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:hover,\n.btn-success:focus,\n.btn-success.focus,\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #ffffff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n background-image: none;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #ffffff;\n}\n.btn-info {\n color: #ffffff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:hover,\n.btn-info:focus,\n.btn-info.focus,\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #ffffff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n background-image: none;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #ffffff;\n}\n.btn-warning {\n color: #ffffff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning.focus,\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #ffffff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n background-image: none;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #ffffff;\n}\n.btn-danger {\n color: #ffffff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger.focus,\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #ffffff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n background-image: none;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #ffffff;\n}\n.btn-link {\n color: #428bca;\n font-weight: normal;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #2a6496;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.33;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n visibility: hidden;\n}\n.collapse.in {\n display: block;\n visibility: visible;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px solid;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n list-style: none;\n font-size: 14px;\n text-align: left;\n background-color: #ffffff;\n border: 1px solid #cccccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n text-decoration: none;\n color: #262626;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #ffffff;\n text-decoration: none;\n outline: 0;\n background-color: #428bca;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n cursor: not-allowed;\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n left: auto;\n right: 0;\n}\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n border-top: 0;\n border-bottom: 4px solid;\n content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 1px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n left: auto;\n right: 0;\n }\n .navbar-right .dropdown-menu-left {\n left: 0;\n right: auto;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus {\n outline: 0;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child > .btn:last-child,\n.btn-group > .btn-group:first-child > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-bottom-left-radius: 4px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.33;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #cccccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n margin-left: -1px;\n}\n.nav {\n margin-bottom: 0;\n padding-left: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #428bca;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #dddddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #dddddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-bottom-color: transparent;\n cursor: default;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #dddddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #ffffff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #ffffff;\n background-color: #428bca;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #dddddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #dddddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #ffffff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n visibility: hidden;\n}\n.tab-content > .active {\n display: block;\n visibility: visible;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n overflow-x: visible;\n padding-right: 15px;\n padding-left: 15px;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n visibility: visible !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-left: 0;\n padding-right: 0;\n }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.navbar-brand {\n float: left;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: 15px;\n padding: 9px 10px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n margin-left: -15px;\n margin-right: -15px;\n padding: 10px 15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-left: 15px;\n margin-right: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #cccccc;\n background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n border-color: #dddddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #dddddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n background-color: #e7e7e7;\n color: #555555;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #cccccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-link {\n color: #777777;\n}\n.navbar-default .navbar-link:hover {\n color: #333333;\n}\n.navbar-default .btn-link {\n color: #777777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #cccccc;\n}\n.navbar-inverse {\n background-color: #222222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #ffffff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #ffffff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #ffffff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #ffffff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n background-color: #080808;\n color: #ffffff;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #ffffff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #ffffff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #ffffff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #ffffff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n content: \"/\\00a0\";\n padding: 0 5px;\n color: #cccccc;\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n line-height: 1.42857143;\n text-decoration: none;\n color: #428bca;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-bottom-left-radius: 4px;\n border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-bottom-right-radius: 4px;\n border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n color: #2a6496;\n background-color: #eeeeee;\n border-color: #dddddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 2;\n color: #ffffff;\n background-color: #428bca;\n border-color: #428bca;\n cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n background-color: #ffffff;\n border-color: #dddddd;\n cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-bottom-left-radius: 6px;\n border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-bottom-right-radius: 6px;\n border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-bottom-left-radius: 3px;\n border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-bottom-right-radius: 3px;\n border-top-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n list-style: none;\n text-align: center;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n background-color: #ffffff;\n cursor: not-allowed;\n}\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #ffffff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n color: #ffffff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #428bca;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #3071a9;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n color: #ffffff;\n line-height: 1;\n vertical-align: baseline;\n white-space: nowrap;\n text-align: center;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #ffffff;\n text-decoration: none;\n cursor: pointer;\n}\na.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #428bca;\n background-color: #ffffff;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding: 30px 15px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n border-radius: 6px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding: 48px 0;\n }\n .container .jumbotron {\n padding-left: 60px;\n padding-right: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-left: auto;\n margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #428bca;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n background-color: #dff0d8;\n border-color: #d6e9c6;\n color: #3c763d;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n background-color: #d9edf7;\n border-color: #bce8f1;\n color: #31708f;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n background-color: #fcf8e3;\n border-color: #faebcc;\n color: #8a6d3b;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n background-color: #f2dede;\n border-color: #ebccd1;\n color: #a94442;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n overflow: hidden;\n height: 20px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #ffffff;\n text-align: center;\n background-color: #428bca;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n 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);\n 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);\n 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);\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n 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);\n 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);\n 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);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n 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);\n 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);\n 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);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n 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);\n 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);\n 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);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n 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);\n 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);\n 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);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n margin-bottom: 20px;\n padding-left: 0;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #ffffff;\n border: 1px solid #dddddd;\n}\n.list-group-item:first-child {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\na.list-group-item {\n color: #555555;\n}\na.list-group-item .list-group-item-heading {\n color: #333333;\n}\na.list-group-item:hover,\na.list-group-item:focus {\n text-decoration: none;\n color: #555555;\n background-color: #f5f5f5;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n background-color: #eeeeee;\n color: #777777;\n cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #ffffff;\n background-color: #428bca;\n border-color: #428bca;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #e1edf7;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\na.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\na.list-group-item-success.active:hover,\na.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\na.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\na.list-group-item-info.active:hover,\na.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\na.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\na.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #ffffff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #dddddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-left: 15px;\n padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-left-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #dddddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n border: 0;\n margin-bottom: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #dddddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #dddddd;\n}\n.panel-default {\n border-color: #dddddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #dddddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #dddddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #dddddd;\n}\n.panel-primary {\n border-color: #428bca;\n}\n.panel-primary > .panel-heading {\n color: #ffffff;\n background-color: #428bca;\n border-color: #428bca;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #428bca;\n}\n.panel-primary > .panel-heading .badge {\n color: #428bca;\n background-color: #ffffff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #428bca;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n}\n.embed-responsive.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000000;\n text-shadow: 0 1px 0 #ffffff;\n opacity: 0.2;\n filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n color: #000000;\n text-decoration: none;\n cursor: pointer;\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #ffffff;\n border: 1px solid #999999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n background-clip: padding-box;\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background-color: #000000;\n}\n.modal-backdrop.fade {\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n min-height: 16.42857143px;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n visibility: visible;\n font-size: 12px;\n line-height: 1.4;\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.tooltip.in {\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.tooltip.top {\n margin-top: -3px;\n padding: 5px 0;\n}\n.tooltip.right {\n margin-left: 3px;\n padding: 0 5px;\n}\n.tooltip.bottom {\n margin-top: 3px;\n padding: 5px 0;\n}\n.tooltip.left {\n margin-left: -3px;\n padding: 0 5px;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #ffffff;\n text-align: center;\n text-decoration: none;\n background-color: #000000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.top-left .tooltip-arrow {\n bottom: 0;\n left: 5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n right: 5px;\n border-width: 5px 5px 0;\n border-top-color: #000000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n left: 5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n right: 5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000000;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1.42857143;\n text-align: left;\n background-color: #ffffff;\n background-clip: padding-box;\n border: 1px solid #cccccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n white-space: normal;\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover-title {\n margin: 0;\n padding: 8px 14px;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow:after {\n border-width: 10px;\n content: \"\";\n}\n.popover.top > .arrow {\n left: 50%;\n margin-left: -11px;\n border-bottom-width: 0;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n bottom: -11px;\n}\n.popover.top > .arrow:after {\n content: \" \";\n bottom: 1px;\n margin-left: -10px;\n border-bottom-width: 0;\n border-top-color: #ffffff;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-left-width: 0;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n content: \" \";\n left: 1px;\n bottom: -10px;\n border-left-width: 0;\n border-right-color: #ffffff;\n}\n.popover.bottom > .arrow {\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n top: -11px;\n}\n.popover.bottom > .arrow:after {\n content: \" \";\n top: 1px;\n margin-left: -10px;\n border-top-width: 0;\n border-bottom-color: #ffffff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: #ffffff;\n bottom: -10px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n}\n.carousel-inner > .item {\n display: none;\n position: relative;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n transition: transform 0.6s ease-in-out;\n backface-visibility: hidden;\n perspective: 1000;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 15%;\n opacity: 0.5;\n filter: alpha(opacity=50);\n font-size: 20px;\n color: #ffffff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n left: auto;\n right: 0;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n outline: 0;\n color: #ffffff;\n text-decoration: none;\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n z-index: 5;\n display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n margin-top: -10px;\n font-family: serif;\n}\n.carousel-control .icon-prev:before {\n content: '\\2039';\n}\n.carousel-control .icon-next:before {\n content: '\\203a';\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid #ffffff;\n border-radius: 10px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: #ffffff;\n}\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #ffffff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -15px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -15px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -15px;\n }\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-footer:before,\n.modal-footer:after {\n content: \" \";\n display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n visibility: hidden !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS text size adjust after orientation change, without disabling\n// user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability when focused and also mouse hovered in all browsers.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome\n// (include `-moz` to future-proof).\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n -moz-box-sizing: content-box;\n -webkit-box-sizing: content-box; // 2\n box-sizing: content-box;\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n box-shadow: none !important;\n text-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n //\n // Chrome (OSX) fix for https://github.com/twbs/bootstrap/issues/11245\n // Once fixed, we can just straight up remove this.\n select {\n background: #fff !important;\n }\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n // Bootstrap specific changes end\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// <a href=\"#\"><span class=\"glyphicon glyphicon-star\"></span> Star</a>\n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('@{icon-font-path}@{icon-font-name}.eot');\n src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\2a\"; } }\n.glyphicon-plus { &:before { content: \"\\2b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // See https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // Default\n outline: thin dotted;\n // WebKit\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @grid-float-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n margin-right: auto;\n margin-left: auto;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: (@gutter / -2);\n margin-right: (@gutter / -2);\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) when (@index = 1) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) when (@index = 1) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n}\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-child(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * 0.75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\n// Set the height of file controls to match text inputs\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &[disabled],\n &[readonly],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n background-color: @input-bg-disabled;\n opacity: 1; // iOS fix for unreadable disabled content\n }\n\n // Reset height for `textarea`s\n textarea& {\n height: auto;\n }\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n\n\n// Special styles for iOS temporal inputs\n//\n// In Mobile Safari, setting `display: block` on temporal inputs causes the\n// text within the input to become vertically misaligned.\n// As a workaround, we set a pixel line-height that matches the\n// given height of the input. Since this fucks up everything else, we have to\n// appropriately reset it for Internet Explorer and the size variations.\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n line-height: @input-height-base;\n // IE8+ misaligns the text within date inputs, so we reset\n line-height: @line-height-base ~\"\\0\";\n\n &.input-sm {\n line-height: @input-height-small;\n line-height: @line-height-small ~\"\\0\";\n }\n &.input-lg {\n line-height: @input-height-large;\n line-height: @line-height-large ~\"\\0\";\n }\n}\n\n// IE 11 hack to reverse the iOS temporal input hack.\n_:-ms-fullscreen, :root input[type=\"date\"],\n_:-ms-fullscreen, :root input[type=\"time\"],\n_:-ms-fullscreen, :root input[type=\"datetime-local\"],\n_:-ms-fullscreen, :root input[type=\"month\"] {\n line-height: @line-height-base;\n\n &.input-sm {\n line-height: @line-height-small;\n }\n &.input-lg {\n line-height: @line-height-large;\n }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: 15px;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n\n label {\n min-height: @line-height-computed; // Ensure the input doesn't jump when there is no text\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because <label>s don't inherit their parent's `cursor`.\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n &[disabled],\n &.disabled,\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n}\n// These classes are used directly on <label>s\n.radio-inline,\n.checkbox-inline {\n &.disabled,\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n}\n// These classes are used on elements with <label> descendants\n.radio,\n.checkbox {\n &.disabled,\n fieldset[disabled] & {\n label {\n cursor: @cursor-disabled;\n }\n }\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n // Size it appropriately next to real form controls\n padding-top: (@padding-base-vertical + 1);\n padding-bottom: (@padding-base-vertical + 1);\n // Remove default margin from `p`\n margin-bottom: 0;\n\n &.input-lg,\n &.input-sm {\n padding-left: 0;\n padding-right: 0;\n }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n\n.input-sm,\n.form-group-sm .form-control {\n .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @input-border-radius-small);\n}\n\n.input-lg,\n.form-group-lg .form-control {\n .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @input-border-radius-large);\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n // Enable absolute positioning\n position: relative;\n\n // Ensure icons don't overlap text\n .form-control {\n padding-right: (@input-height-base * 1.25);\n }\n}\n// Feedback icon (requires .glyphicon classes)\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2; // Ensure icon is above input groups\n display: block;\n width: @input-height-base;\n height: @input-height-base;\n line-height: @input-height-base;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback {\n width: @input-height-large;\n height: @input-height-large;\n line-height: @input-height-large;\n}\n.input-sm + .form-control-feedback {\n width: @input-height-small;\n height: @input-height-small;\n line-height: @input-height-small;\n}\n\n// Feedback states\n.has-success {\n .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);\n}\n.has-warning {\n .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);\n}\n.has-error {\n .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);\n}\n\n// Reposition feedback icon if input has visible label above\n.has-feedback label {\n\n & ~ .form-control-feedback {\n top: (@line-height-computed + 5); // Height of the `label` and its margin\n }\n &.sr-only ~ .form-control-feedback {\n top: 0;\n }\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n display: block; // account for any element using help-block\n margin-top: 5px;\n margin-bottom: 10px;\n color: lighten(@text-color, 25%); // lighten the text some for contrast\n}\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n.form-inline {\n\n // Kick in the inline\n @media (min-width: @screen-sm-min) {\n // Inline-block all the things for \"inline\"\n .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // In navbar-form, allow folks to *not* use `.form-group`\n .form-control {\n display: inline-block;\n width: auto; // Prevent labels from stacking above inputs in `.form-group`\n vertical-align: middle;\n }\n\n // Make static controls behave like regular ones\n .form-control-static {\n display: inline-block;\n }\n\n .input-group {\n display: inline-table;\n vertical-align: middle;\n\n .input-group-addon,\n .input-group-btn,\n .form-control {\n width: auto;\n }\n }\n\n // Input groups need that 100% width though\n .input-group > .form-control {\n width: 100%;\n }\n\n .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // Remove default margin on radios/checkboxes that were used for stacking, and\n // then undo the floating of radios and checkboxes to match (which also avoids\n // a bug in WebKit: https://github.com/twbs/bootstrap/issues/1969).\n .radio,\n .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n\n label {\n padding-left: 0;\n }\n }\n .radio input[type=\"radio\"],\n .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n\n // Re-override the feedback icon.\n .has-feedback .form-control-feedback {\n top: 0;\n }\n }\n}\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n // Consistent vertical alignment of radios and checkboxes\n //\n // Labels also get some reset styles, but that is scoped to a media query below.\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n // Account for padding we're adding to ensure the alignment and of help text\n // and other content below items\n .radio,\n .checkbox {\n min-height: (@line-height-computed + (@padding-base-vertical + 1));\n }\n\n // Make form groups behave like rows\n .form-group {\n .make-row();\n }\n\n // Reset spacing and right align labels, but scope to media queries so that\n // labels on narrow viewports stack the same as a default form example.\n @media (min-width: @screen-sm-min) {\n .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n }\n\n // Validation states\n //\n // Reposition the icon because it's now within a grid column and columns have\n // `position: relative;` on them. Also accounts for the grid gutter padding.\n .has-feedback .form-control-feedback {\n right: (@grid-gutter-width / 2);\n }\n\n // Form group sizes\n //\n // Quick utility class for applying `.input-lg` and `.input-sm` styles to the\n // inputs and labels within a `.form-group`.\n .form-group-lg {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: ((@padding-large-vertical * @line-height-large) + 1);\n }\n }\n }\n .form-group-sm {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: (@padding-small-vertical + 1);\n }\n }\n }\n}\n","// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\n // Color the label and help text\n .help-block,\n .control-label,\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline,\n &.radio label,\n &.checkbox label,\n &.radio-inline label,\n &.checkbox-inline label {\n color: @text-color;\n }\n // Set the border and box shadow on specific inputs to match\n .form-control {\n border-color: @border-color;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n &:focus {\n border-color: darken(@border-color, 10%);\n @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\n .box-shadow(@shadow);\n }\n }\n // Set validation states also for addons\n .input-group-addon {\n color: @text-color;\n border-color: @border-color;\n background-color: @background-color;\n }\n // Optional feedback icon\n .form-control-feedback {\n color: @text-color;\n }\n}\n\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-border-focus` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n.form-control-focus(@color: @input-border-focus) {\n @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\n &:focus {\n border-color: @color;\n outline: 0;\n .box-shadow(~\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}\");\n }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. `<select>`\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n display: inline-block;\n margin-bottom: 0; // For input.btn\n font-weight: @btn-font-weight;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n white-space: nowrap;\n .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @border-radius-base);\n .user-select(none);\n\n &,\n &:active,\n &.active {\n &:focus,\n &.focus {\n .tab-focus();\n }\n }\n\n &:hover,\n &:focus,\n &.focus {\n color: @btn-default-color;\n text-decoration: none;\n }\n\n &:active,\n &.active {\n outline: 0;\n background-image: none;\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n pointer-events: none; // Future-proof disabling of clicks\n .opacity(.65);\n .box-shadow(none);\n }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n color: @link-color;\n font-weight: normal;\n border-radius: 0;\n\n &,\n &:active,\n &.active,\n &[disabled],\n fieldset[disabled] & {\n background-color: transparent;\n .box-shadow(none);\n }\n &,\n &:hover,\n &:focus,\n &:active {\n border-color: transparent;\n }\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: underline;\n background-color: transparent;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @btn-link-disabled-color;\n text-decoration: none;\n }\n }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n // line-height: ensure even-numbered height of button next to large input\n .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n.btn-sm {\n // line-height: ensure proper height of button next to small input\n .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n.btn-xs {\n .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: @background;\n border-color: @border;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n}\n","// Opacity\n\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n opacity: 0;\n .transition(opacity .15s linear);\n &.in {\n opacity: 1;\n }\n}\n\n.collapse {\n display: none;\n visibility: hidden;\n\n &.in { display: block; visibility: visible; }\n tr&.in { display: table-row; }\n tbody&.in { display: table-row-group; }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n .transition-property(~\"height, visibility\");\n .transition-duration(.35s);\n .transition-timing-function(ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: @caret-width-base solid;\n border-right: @caret-width-base solid transparent;\n border-left: @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropdown {\n position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: @zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0; // override default ul\n list-style: none;\n font-size: @font-size-base;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n background-color: @dropdown-bg;\n border: 1px solid @dropdown-fallback-border; // IE8 fallback\n border: 1px solid @dropdown-border;\n border-radius: @border-radius-base;\n .box-shadow(0 6px 12px rgba(0,0,0,.175));\n background-clip: padding-box;\n\n // Aligns the dropdown menu to right\n //\n // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n &.pull-right {\n right: 0;\n left: auto;\n }\n\n // Dividers (basically an hr) within the dropdown\n .divider {\n .nav-divider(@dropdown-divider-bg);\n }\n\n // Links within the dropdown menu\n > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: @line-height-base;\n color: @dropdown-link-color;\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n &:hover,\n &:focus {\n text-decoration: none;\n color: @dropdown-link-hover-color;\n background-color: @dropdown-link-hover-bg;\n }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-active-color;\n text-decoration: none;\n outline: 0;\n background-color: @dropdown-link-active-bg;\n }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-disabled-color;\n }\n\n // Nuke hover/focus effects\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none; // Remove CSS gradient\n .reset-filter();\n cursor: @cursor-disabled;\n }\n}\n\n// Open state for the dropdown\n.open {\n // Show the menu\n > .dropdown-menu {\n display: block;\n }\n\n // Remove the outline when :focus is triggered\n > a {\n outline: 0;\n }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n left: auto; // Reset the default from `.dropdown-menu`\n right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: @font-size-small;\n line-height: @line-height-base;\n color: @dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n // Reverse the caret\n .caret {\n border-top: 0;\n border-bottom: @caret-width-base solid;\n content: \"\";\n }\n // Different positioning for bottom up menu\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 1px;\n }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-right {\n .dropdown-menu {\n .dropdown-menu-right();\n }\n // Necessary for overrides of the default right aligned menu.\n // Will remove come v4 in all likelihood.\n .dropdown-menu-left {\n .dropdown-menu-left();\n }\n }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; // match .btn alignment given font-size hack above\n > .btn {\n position: relative;\n float: left;\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active,\n &.active {\n z-index: 2;\n }\n &:focus {\n // Remove focus outline when dropdown JS adds it after closing the menu\n outline: 0;\n }\n }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -1px;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n margin-left: -5px; // Offset the first child's margin\n &:extend(.clearfix all);\n\n .btn-group,\n .input-group {\n float: left;\n }\n > .btn,\n > .btn-group,\n > .input-group {\n margin-left: 5px;\n }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n margin-left: 0;\n &:not(:last-child):not(.dropdown-toggle) {\n .border-right-radius(0);\n }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-right-radius(0);\n }\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n .box-shadow(none);\n }\n}\n\n\n// Reposition the caret\n.btn .caret {\n margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n border-width: @caret-width-large @caret-width-large 0;\n border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n > .btn,\n > .btn-group,\n > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n }\n\n // Clear floats so dropdown menus can be properly placed\n > .btn-group {\n &:extend(.clearfix all);\n > .btn {\n float: none;\n }\n }\n\n > .btn + .btn,\n > .btn + .btn-group,\n > .btn-group + .btn,\n > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n }\n}\n\n.btn-group-vertical > .btn {\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n &:first-child:not(:last-child) {\n border-top-right-radius: @border-radius-base;\n .border-bottom-radius(0);\n }\n &:last-child:not(:first-child) {\n border-bottom-left-radius: @border-radius-base;\n .border-top-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-bottom-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n > .btn,\n > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n }\n > .btn-group .btn {\n width: 100%;\n }\n\n > .btn-group .dropdown-menu {\n left: auto;\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n > .btn,\n > .btn-group > .btn {\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0,0,0,0);\n pointer-events: none;\n }\n }\n}\n","// Single side border-radius\n\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n position: relative; // For dropdowns\n display: table;\n border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n // Undo padding and float of grid classes\n &[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n }\n\n .form-control {\n // Ensure that the input is always above the *appended* addon button for\n // proper border colors.\n position: relative;\n z-index: 2;\n\n // IE9 fubars the placeholder attribute in text inputs and the arrows on\n // select elements in input groups. To fix it, we float the input. Details:\n // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n float: left;\n\n width: 100%;\n margin-bottom: 0;\n }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n .input-lg();\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n .input-sm();\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 1;\n color: @input-color;\n text-align: center;\n background-color: @input-group-addon-bg;\n border: 1px solid @input-group-addon-border-color;\n border-radius: @border-radius-base;\n\n // Sizing\n &.input-sm {\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n border-radius: @border-radius-small;\n }\n &.input-lg {\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n border-radius: @border-radius-large;\n }\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n .border-right-radius(0);\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n .border-left-radius(0);\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n position: relative;\n // Jankily prevent input button groups from wrapping with `white-space` and\n // `font-size` in combination with `inline-block` on buttons.\n font-size: 0;\n white-space: nowrap;\n\n // Negative margin for spacing, position for bringing hovered/focused/actived\n // element above the siblings.\n > .btn {\n position: relative;\n + .btn {\n margin-left: -1px;\n }\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active {\n z-index: 2;\n }\n }\n\n // Negative margin to only have a 1px border between the two\n &:first-child {\n > .btn,\n > .btn-group {\n margin-right: -1px;\n }\n }\n &:last-child {\n > .btn,\n > .btn-group {\n margin-left: -1px;\n }\n }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n margin-bottom: 0;\n padding-left: 0; // Override default ul/ol\n list-style: none;\n &:extend(.clearfix all);\n\n > li {\n position: relative;\n display: block;\n\n > a {\n position: relative;\n display: block;\n padding: @nav-link-padding;\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @nav-link-hover-bg;\n }\n }\n\n // Disabled state sets text to gray and nukes hover/tab effects\n &.disabled > a {\n color: @nav-disabled-link-color;\n\n &:hover,\n &:focus {\n color: @nav-disabled-link-hover-color;\n text-decoration: none;\n background-color: transparent;\n cursor: @cursor-disabled;\n }\n }\n }\n\n // Open dropdowns\n .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @nav-link-hover-bg;\n border-color: @link-color;\n }\n }\n\n // Nav dividers (deprecated with v3.0.1)\n //\n // This should have been removed in v3 with the dropping of `.nav-list`, but\n // we missed it. We don't currently support this anywhere, but in the interest\n // of maintaining backward compatibility in case you use it, it's deprecated.\n .nav-divider {\n .nav-divider();\n }\n\n // Prevent IE8 from misplacing imgs\n //\n // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n > li > a > img {\n max-width: none;\n }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n border-bottom: 1px solid @nav-tabs-border-color;\n > li {\n float: left;\n // Make the list-items overlay the bottom border\n margin-bottom: -1px;\n\n // Actual tabs (as links)\n > a {\n margin-right: 2px;\n line-height: @line-height-base;\n border: 1px solid transparent;\n border-radius: @border-radius-base @border-radius-base 0 0;\n &:hover {\n border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n }\n }\n\n // Active state, and its :hover to override normal :hover\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-tabs-active-link-hover-color;\n background-color: @nav-tabs-active-link-hover-bg;\n border: 1px solid @nav-tabs-active-link-hover-border-color;\n border-bottom-color: transparent;\n cursor: default;\n }\n }\n }\n // pulling this in mainly for less shorthand\n &.nav-justified {\n .nav-justified();\n .nav-tabs-justified();\n }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n > li {\n float: left;\n\n // Links rendered as pills\n > a {\n border-radius: @nav-pills-border-radius;\n }\n + li {\n margin-left: 2px;\n }\n\n // Active state\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-pills-active-link-hover-color;\n background-color: @nav-pills-active-link-hover-bg;\n }\n }\n }\n}\n\n\n// Stacked pills\n.nav-stacked {\n > li {\n float: none;\n + li {\n margin-top: 2px;\n margin-left: 0; // no need for this gap between nav items\n }\n }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n width: 100%;\n\n > li {\n float: none;\n > a {\n text-align: center;\n margin-bottom: 5px;\n }\n }\n\n > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n }\n\n @media (min-width: @screen-sm-min) {\n > li {\n display: table-cell;\n width: 1%;\n > a {\n margin-bottom: 0;\n }\n }\n }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n border-bottom: 0;\n\n > li > a {\n // Override margin from .nav-tabs\n margin-right: 0;\n border-radius: @border-radius-base;\n }\n\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border: 1px solid @nav-tabs-justified-link-border-color;\n }\n\n @media (min-width: @screen-sm-min) {\n > li > a {\n border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n border-radius: @border-radius-base @border-radius-base 0 0;\n }\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border-bottom-color: @nav-tabs-justified-active-link-border-color;\n }\n }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n > .tab-pane {\n display: none;\n visibility: hidden;\n }\n > .active {\n display: block;\n visibility: visible;\n }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n // make dropdown border overlap tab border\n margin-top: -1px;\n // Remove the top rounded corners here since there is a hard edge above the menu\n .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n margin-bottom: @navbar-margin-bottom;\n border: 1px solid transparent;\n\n // Prevent floats from breaking the navbar\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: @navbar-border-radius;\n }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n overflow-x: visible;\n padding-right: @navbar-padding-horizontal;\n padding-left: @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n &:extend(.clearfix all);\n -webkit-overflow-scrolling: touch;\n\n &.in {\n overflow-y: auto;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border-top: 0;\n box-shadow: none;\n\n &.collapse {\n display: block !important;\n visibility: visible !important;\n height: auto !important;\n padding-bottom: 0; // Override default setting\n overflow: visible !important;\n }\n\n &.in {\n overflow-y: visible;\n }\n\n // Undo the collapse side padding for navbars with containers to ensure\n // alignment of right-aligned contents.\n .navbar-fixed-top &,\n .navbar-static-top &,\n .navbar-fixed-bottom & {\n padding-left: 0;\n padding-right: 0;\n }\n }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n .navbar-collapse {\n max-height: @navbar-collapse-max-height;\n\n @media (max-device-width: @screen-xs-min) and (orientation: landscape) {\n max-height: 200px;\n }\n }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n > .navbar-header,\n > .navbar-collapse {\n margin-right: -@navbar-padding-horizontal;\n margin-left: -@navbar-padding-horizontal;\n\n @media (min-width: @grid-float-breakpoint) {\n margin-right: 0;\n margin-left: 0;\n }\n }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n z-index: @zindex-navbar;\n border-width: 0 0 1px;\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: @zindex-navbar-fixed;\n\n // Undo the rounded corners\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0; // override .navbar defaults\n border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n float: left;\n padding: @navbar-padding-vertical @navbar-padding-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-computed;\n height: @navbar-height;\n\n &:hover,\n &:focus {\n text-decoration: none;\n }\n\n > img {\n display: block;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n .navbar > .container &,\n .navbar > .container-fluid & {\n margin-left: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: @navbar-padding-horizontal;\n padding: 9px 10px;\n .navbar-vertical-align(34px);\n background-color: transparent;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n border-radius: @border-radius-base;\n\n // We remove the `outline` here, but later compensate by attaching `:hover`\n // styles to `:focus`.\n &:focus {\n outline: 0;\n }\n\n // Bars\n .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n }\n .icon-bar + .icon-bar {\n margin-top: 4px;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n display: none;\n }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: @line-height-computed;\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n > li > a,\n .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n > li > a {\n line-height: @line-height-computed;\n &:hover,\n &:focus {\n background-image: none;\n }\n }\n }\n }\n\n // Uncollapse the nav\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin: 0;\n\n > li {\n float: left;\n > a {\n padding-top: @navbar-padding-vertical;\n padding-bottom: @navbar-padding-vertical;\n }\n }\n }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n margin-left: -@navbar-padding-horizontal;\n margin-right: -@navbar-padding-horizontal;\n padding: 10px @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n\n // Mixin behavior for optimum display\n .form-inline();\n\n .form-group {\n @media (max-width: @grid-float-breakpoint-max) {\n margin-bottom: 5px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n }\n\n // Vertically center in expanded, horizontal navbar\n .navbar-vertical-align(@input-height-base);\n\n // Undo 100% width for pull classes\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n .box-shadow(none);\n }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n .navbar-vertical-align(@input-height-base);\n\n &.btn-sm {\n .navbar-vertical-align(@input-height-small);\n }\n &.btn-xs {\n .navbar-vertical-align(22);\n }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n .navbar-vertical-align(@line-height-computed);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin-left: @navbar-padding-horizontal;\n margin-right: @navbar-padding-horizontal;\n }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-left { .pull-left(); }\n .navbar-right {\n .pull-right();\n margin-right: -@navbar-padding-horizontal;\n\n ~ .navbar-right {\n margin-right: 0;\n }\n }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n background-color: @navbar-default-bg;\n border-color: @navbar-default-border;\n\n .navbar-brand {\n color: @navbar-default-brand-color;\n &:hover,\n &:focus {\n color: @navbar-default-brand-hover-color;\n background-color: @navbar-default-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-default-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-default-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n\n .navbar-toggle {\n border-color: @navbar-default-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-default-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-default-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: @navbar-default-border;\n }\n\n // Dropdown menu items\n .navbar-nav {\n // Remove background color from open dropdown\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-default-link-active-bg;\n color: @navbar-default-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n > li > a {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n }\n }\n\n\n // Links in navbars\n //\n // Add a class to ensure links outside the navbar nav are colored correctly.\n\n .navbar-link {\n color: @navbar-default-link-color;\n &:hover {\n color: @navbar-default-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n }\n }\n }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n background-color: @navbar-inverse-bg;\n border-color: @navbar-inverse-border;\n\n .navbar-brand {\n color: @navbar-inverse-brand-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-brand-hover-color;\n background-color: @navbar-inverse-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-inverse-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-inverse-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n\n // Darken the responsive nav toggle\n .navbar-toggle {\n border-color: @navbar-inverse-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-inverse-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-inverse-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: darken(@navbar-inverse-bg, 7%);\n }\n\n // Dropdowns\n .navbar-nav {\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-inverse-link-active-bg;\n color: @navbar-inverse-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display\n .open .dropdown-menu {\n > .dropdown-header {\n border-color: @navbar-inverse-border;\n }\n .divider {\n background-color: @navbar-inverse-border;\n }\n > li > a {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n }\n }\n\n .navbar-link {\n color: @navbar-inverse-link-color;\n &:hover {\n color: @navbar-inverse-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n }\n }\n }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n.navbar-vertical-align(@element-height) {\n margin-top: ((@navbar-height - @element-height) / 2);\n margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n .clearfix();\n}\n.center-block {\n .center-block();\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n visibility: hidden !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n position: fixed;\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n margin-bottom: @line-height-computed;\n list-style: none;\n background-color: @breadcrumb-bg;\n border-radius: @border-radius-base;\n\n > li {\n display: inline-block;\n\n + li:before {\n content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n padding: 0 5px;\n color: @breadcrumb-color;\n }\n }\n\n > .active {\n color: @breadcrumb-active-color;\n }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: @line-height-computed 0;\n border-radius: @border-radius-base;\n\n > li {\n display: inline; // Remove list-style and block-level defaults\n > a,\n > span {\n position: relative;\n float: left; // Collapse white-space\n padding: @padding-base-vertical @padding-base-horizontal;\n line-height: @line-height-base;\n text-decoration: none;\n color: @pagination-color;\n background-color: @pagination-bg;\n border: 1px solid @pagination-border;\n margin-left: -1px;\n }\n &:first-child {\n > a,\n > span {\n margin-left: 0;\n .border-left-radius(@border-radius-base);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius-base);\n }\n }\n }\n\n > li > a,\n > li > span {\n &:hover,\n &:focus {\n color: @pagination-hover-color;\n background-color: @pagination-hover-bg;\n border-color: @pagination-hover-border;\n }\n }\n\n > .active > a,\n > .active > span {\n &,\n &:hover,\n &:focus {\n z-index: 2;\n color: @pagination-active-color;\n background-color: @pagination-active-bg;\n border-color: @pagination-active-border;\n cursor: default;\n }\n }\n\n > .disabled {\n > span,\n > span:hover,\n > span:focus,\n > a,\n > a:hover,\n > a:focus {\n color: @pagination-disabled-color;\n background-color: @pagination-disabled-bg;\n border-color: @pagination-disabled-border;\n cursor: @cursor-disabled;\n }\n }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @border-radius-small);\n}\n","// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n padding-left: 0;\n margin: @line-height-computed 0;\n list-style: none;\n text-align: center;\n &:extend(.clearfix all);\n li {\n display: inline;\n > a,\n > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: @pager-bg;\n border: 1px solid @pager-border;\n border-radius: @pager-border-radius;\n }\n\n > a:hover,\n > a:focus {\n text-decoration: none;\n background-color: @pager-hover-bg;\n }\n }\n\n .next {\n > a,\n > span {\n float: right;\n }\n }\n\n .previous {\n > a,\n > span {\n float: left;\n }\n }\n\n .disabled {\n > a,\n > a:hover,\n > a:focus,\n > span {\n color: @pager-disabled-color;\n background-color: @pager-bg;\n cursor: @cursor-disabled;\n }\n }\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: @label-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n\n // Add hover effects, but only for links\n a& {\n &:hover,\n &:focus {\n color: @label-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Empty labels collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for labels in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n .label-variant(@label-default-bg);\n}\n\n.label-primary {\n .label-variant(@label-primary-bg);\n}\n\n.label-success {\n .label-variant(@label-success-bg);\n}\n\n.label-info {\n .label-variant(@label-info-bg);\n}\n\n.label-warning {\n .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n .label-variant(@label-danger-bg);\n}\n","// Labels\n\n.label-variant(@color) {\n background-color: @color;\n\n &[href] {\n &:hover,\n &:focus {\n background-color: darken(@color, 10%);\n }\n }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: @font-size-small;\n font-weight: @badge-font-weight;\n color: @badge-color;\n line-height: @badge-line-height;\n vertical-align: baseline;\n white-space: nowrap;\n text-align: center;\n background-color: @badge-bg;\n border-radius: @badge-border-radius;\n\n // Empty badges collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for badges in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n .btn-xs & {\n top: 0;\n padding: 1px 5px;\n }\n\n // Hover state, but only for links\n a& {\n &:hover,\n &:focus {\n color: @badge-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Account for badges in navs\n a.list-group-item.active > &,\n .nav-pills > .active > a > & {\n color: @badge-active-color;\n background-color: @badge-active-bg;\n }\n .nav-pills > li > a > & {\n margin-left: 3px;\n }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n padding: @jumbotron-padding (@jumbotron-padding / 2);\n margin-bottom: @jumbotron-padding;\n color: @jumbotron-color;\n background-color: @jumbotron-bg;\n\n h1,\n .h1 {\n color: @jumbotron-heading-color;\n }\n p {\n margin-bottom: (@jumbotron-padding / 2);\n font-size: @jumbotron-font-size;\n font-weight: 200;\n }\n\n > hr {\n border-top-color: darken(@jumbotron-bg, 10%);\n }\n\n .container &,\n .container-fluid & {\n border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n }\n\n .container {\n max-width: 100%;\n }\n\n @media screen and (min-width: @screen-sm-min) {\n padding: (@jumbotron-padding * 1.6) 0;\n\n .container & {\n padding-left: (@jumbotron-padding * 2);\n padding-right: (@jumbotron-padding * 2);\n }\n\n h1,\n .h1 {\n font-size: (@font-size-base * 4.5);\n }\n }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n display: block;\n padding: @thumbnail-padding;\n margin-bottom: @line-height-computed;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(border .2s ease-in-out);\n\n > img,\n a > img {\n &:extend(.img-responsive);\n margin-left: auto;\n margin-right: auto;\n }\n\n // Add a hover state for linked versions only\n a&:hover,\n a&:focus,\n a&.active {\n border-color: @link-color;\n }\n\n // Image captions\n .caption {\n padding: @thumbnail-caption-padding;\n color: @thumbnail-caption-color;\n }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n padding: @alert-padding;\n margin-bottom: @line-height-computed;\n border: 1px solid transparent;\n border-radius: @alert-border-radius;\n\n // Headings for larger alerts\n h4 {\n margin-top: 0;\n // Specified for the h4 to prevent conflicts of changing @headings-color\n color: inherit;\n }\n // Provide class for links that match alerts\n .alert-link {\n font-weight: @alert-link-font-weight;\n }\n\n // Improve alignment and spacing of inner content\n > p,\n > ul {\n margin-bottom: 0;\n }\n > p + p {\n margin-top: 5px;\n }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n padding-right: (@alert-padding + 20);\n\n // Adjust close link position\n .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n.alert-info {\n .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n.alert-warning {\n .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n.alert-danger {\n .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n overflow: hidden;\n height: @line-height-computed;\n margin-bottom: @line-height-computed;\n background-color: @progress-bg;\n border-radius: @progress-border-radius;\n .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: @font-size-small;\n line-height: @line-height-computed;\n color: @progress-bar-color;\n text-align: center;\n background-color: @progress-bar-bg;\n .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n .transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n #gradient > .striped();\n background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"pro
|