├── .gitignore ├── .nvmrc ├── Cakefile ├── LICENSE ├── README.md ├── example ├── bigbluebutton-api.js ├── bootstrap.min.css ├── crypto-sha1-2.5.3.js ├── index.html └── style.css ├── lib └── bigbluebutton-api.js ├── package-lock.json ├── package.json ├── src └── bigbluebutton-api.coffee └── vendor └── jsSHA.js /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | **/#*# 3 | *.log 4 | node_modules/ 5 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v12.4.0 2 | -------------------------------------------------------------------------------- /Cakefile: -------------------------------------------------------------------------------- 1 | fs = require 'fs' 2 | 3 | {print} = require 'util' 4 | {spawn} = require 'child_process' 5 | 6 | binPath = './node_modules/.bin/' 7 | 8 | # Returns a string with the current time to print out. 9 | timeNow = -> 10 | today = new Date() 11 | today.getHours() + ":" + today.getMinutes() + ":" + today.getSeconds() 12 | 13 | # Spawns an application with `options` and calls `onExit` 14 | # when it finishes. 15 | run = (bin, options, onExit) -> 16 | bin = binPath + bin 17 | console.log timeNow() + ' - running: ' + bin + ' ' + (if options? then options.join(' ') else "") 18 | cmd = spawn bin, options 19 | cmd.stdout.on 'data', (data) -> print data.toString() 20 | cmd.stderr.on 'data', (data) -> print data.toString() 21 | cmd.on 'exit', (code) -> 22 | console.log 'done.' 23 | onExit?(code, options) 24 | 25 | build = (callback) -> 26 | options = ['-c', '-o', 'lib', 'src'] 27 | run('coffee', options) 28 | 29 | task 'build', 'Build lib/ from src/', -> 30 | build() 31 | 32 | task 'watch', 'Watch src/ for changes', -> 33 | options = ['-w', '-c', '-o', 'lib', 'src/bigbluebutton-api.coffee'] 34 | run('coffee', options) 35 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2012 Mconf (http://mconf.org) 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | this software and associated documentation files (the "Software"), to deal in 5 | the Software without restriction, including without limitation the rights to 6 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 7 | the Software, and to permit persons to whom the Software is furnished to do so, 8 | subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 15 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 16 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 17 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 18 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 19 | 20 | This project is developed as part of Mconf (http://mconf.org). 21 | Contact information: 22 | Mconf: A scalable opensource multiconference system for web and mobile devices 23 | PRAV Labs - UFRGS - Porto Alegre - Brazil 24 | http://mconf.org/m/about/contact 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | bigbluebutton-api-js 2 | ==================== 3 | 4 | `bigbluebutton-api-js` is a very simple Javascript library that 5 | generates links to all methods in 6 | [BigBlueButton's API](http://code.google.com/p/bigbluebutton/wiki/API). 7 | It's written in [Coffeescript](http://coffeescript.org/) and should 8 | work in the browser or in [Node.js](http://nodejs.org/) applications. 9 | 10 | Example 11 | ------- 12 | 13 | Open `example/index.html` or check http://mconf.github.com/bigbluebutton-api-js 14 | for a quick example of what this lib does. 15 | 16 | Features 17 | -------- 18 | 19 | * Gives you links to all API methods. 20 | * No matter what parameters you pass to it, the lib will only use the parameters that are supported for each API call. 21 | * You can pass meta parameters to `create` using the prefix `meta_`. 22 | * You can pass any custom parameters to all API calls with the prefix `custom_`. 23 | * You can get links for custom API calls. This is useful when developing new API methods. 24 | * You can also get links to a single method or just get the checksum for a call. 25 | 26 | Usage 27 | ----- 28 | 29 | This library requires: 30 | * [jsSHA](https://github.com/Caligatio/jsSHA), used to calculate checksums. 31 | You can download it from their website or use the minified version that can be found in the 32 | `vendor` directory. 33 | 34 | Add these libraries and `bigbluebutton-api.js` to your page. Then you can get the links to the API calls 35 | with a code similar to this example (code in Coffeescript): 36 | 37 | ```coffeescript 38 | # Create an API object passing the url and the shared secret 39 | api = new BigBlueButtonApi("http://test-install.blindsidenetworks.com/bigbluebutton/api/", 40 | "8cd8ef52e8e101574e400365b55e11a6") 41 | 42 | # A hash of parameters. 43 | # The parameter names are the same names BigBlueButton expects to receive in the API calls. 44 | # The lib will make sure that, for each API call, only the parameters supported will be used. 45 | params = 46 | name: "random-123" 47 | meetingID: "random-123" 48 | moderatorPW: "mp" 49 | attendeePW: "ap" 50 | password: "mp" # usually equals "moderatorPW" 51 | welcome: "
Welcome to %%CONFNAME%%!" 52 | fullName: "User 8584148" 53 | publish: false 54 | random: "416074726" 55 | record: false 56 | recordID: "random-9998650" 57 | voiceBridge: "75858" 58 | meta_anything: "My Meta Parameter" 59 | custom_customParameter: "Will be passed as 'customParameter' to all calls" 60 | 61 | urls = [] 62 | for method in api.availableApiCalls() 63 | urls.push { name: method, url: api.urlFor(method, params) } 64 | ``` 65 | 66 | This call will create an array with several objects, each one defining a single API call. These objects have the following format: 67 | 68 | ```coffeescript 69 | { 70 | name: 'join' 71 | url: 'http://test-install.blindsidenetworks.com/bigbluebutton/api/create?name=random-266119&meetingID=random-266119&moderatorPW=mp&attendeePW=ap&voiceBridge=76262&record=false&checksum=6c529b6e31fbce9668fd66d99a09da7a78f4' 72 | } 73 | ``` 74 | 75 | Where: 76 | 77 | * `name`: the name of the API method. 78 | * `url`: the URL to call the method, as returned by `bigbluebutton-api-js`. 79 | 80 | 81 | 82 | ### Custom parameters 83 | 84 | You can pass custom parameters using the prefix `custom_`. These parameters will be included in 85 | **all** API calls. 86 | 87 | 88 | ```coffeescript 89 | params = 90 | name: "random-123" 91 | meetingID: "random-123" 92 | custom_customParameter: "random" 93 | custom_another: 123 94 | url = api.urlFor('join', params) 95 | ``` 96 | 97 | Will return URLs such as: 98 | 99 | ```coffeescript 100 | "http://server.com/bigbluebutton/api/create?name=random-123&meetingID=random-123&customParameter=random&another=123&checksum=6c529b6e31fbce9668fd66d99a09da7a78f4" 101 | ``` 102 | 103 | ### Metadata 104 | 105 | Pass metadata parameters using the prefix `meta_`. These parameters will be included in only in the API calls 106 | that support metadata. 107 | 108 | ```coffeescript 109 | params = 110 | name: "random-9998650" 111 | meetingID: "random-9998650" 112 | meta_any: "random" 113 | meta_another: 123 114 | url = api.urlFor('create', params) 115 | ``` 116 | 117 | Will return URLs such as: 118 | 119 | ```coffeescript 120 | "http://server.com/bigbluebutton/api/create?name=random-123&meetingID=random-123&meta_any=random&meta_another=123&checksum=6c529b6e31fbce9668fd66d99a09da7a78f4" 121 | ``` 122 | 123 | ### Custom API calls 124 | 125 | You can pass any method you'd like to `urlFor()`, even if it's not a method supported 126 | by default on BigBlueButton's API. **All** the parameters passed to `urlFor` will be 127 | added to the API call. 128 | 129 | 130 | ```coffeescript 131 | params = 132 | meetingID: "random-9998650" 133 | meta_any: "random" 134 | custom_another: 123 135 | url = api.urlFor('customApiCall', params) 136 | ``` 137 | 138 | Will return URLs such as: 139 | 140 | ```coffeescript 141 | "http://server.com/bigbluebutton/api/customApiCall?meetingID=random-123&meta_any=random&another=123&checksum=6c529b6e31fbce9668fd66d99a09da7a78f4" 142 | 143 | ### More 144 | 145 | * To get just the checksum for a call you can use the method `checksum`. For example: `api.checksum("isMeetingRunning", "meetingID=mymeeting&custom=1", false)`. 146 | 147 | 148 | Development 149 | ----------- 150 | 151 | At first, install [Node.js](http://nodejs.org/) (see `package.json` for the specific version required). 152 | 153 | Install the dependencies with: 154 | 155 | npm install 156 | 157 | Then, to compile the coffee files into javascript, run: 158 | 159 | cake build 160 | 161 | This will compile all `*.coffee` files in `/src` to javascript files in `/lib`. 162 | 163 | To watch for changes and compile the files automatically run: 164 | 165 | cake watch 166 | 167 | License 168 | ------- 169 | 170 | Distributed under The MIT License (MIT), see `LICENSE`. 171 | -------------------------------------------------------------------------------- /example/bigbluebutton-api.js: -------------------------------------------------------------------------------- 1 | ../lib/bigbluebutton-api.js -------------------------------------------------------------------------------- /example/bootstrap.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v2.2.1 3 | * 4 | * Copyright 2012 Twitter, Inc 5 | * Licensed under the Apache License v2.0 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Designed and built with all the love in the world @twitter by @mdo and @fat. 9 | */ 10 | .clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";line-height:0;} 11 | .clearfix:after{clear:both;} 12 | .hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0;} 13 | .input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} 14 | article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;} 15 | audio,canvas,video{display:inline-block;*display:inline;*zoom:1;} 16 | audio:not([controls]){display:none;} 17 | html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;} 18 | a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} 19 | a:hover,a:active{outline:0;} 20 | sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;} 21 | sup{top:-0.5em;} 22 | sub{bottom:-0.25em;} 23 | img{max-width:100%;width:auto\9;height:auto;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic;} 24 | #map_canvas img,.google-maps img{max-width:none;} 25 | button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;} 26 | button,input{*overflow:visible;line-height:normal;} 27 | button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;} 28 | button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;} 29 | input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield;} 30 | input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;} 31 | textarea{overflow:auto;vertical-align:top;} 32 | body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333333;background-color:#ffffff;} 33 | a{color:#0088cc;text-decoration:none;} 34 | a:hover{color:#005580;text-decoration:underline;} 35 | .img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} 36 | .img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);} 37 | .img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px;} 38 | .row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";line-height:0;} 39 | .row:after{clear:both;} 40 | [class*="span"]{float:left;min-height:1px;margin-left:20px;} 41 | .container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;} 42 | .span12{width:940px;} 43 | .span11{width:860px;} 44 | .span10{width:780px;} 45 | .span9{width:700px;} 46 | .span8{width:620px;} 47 | .span7{width:540px;} 48 | .span6{width:460px;} 49 | .span5{width:380px;} 50 | .span4{width:300px;} 51 | .span3{width:220px;} 52 | .span2{width:140px;} 53 | .span1{width:60px;} 54 | .offset12{margin-left:980px;} 55 | .offset11{margin-left:900px;} 56 | .offset10{margin-left:820px;} 57 | .offset9{margin-left:740px;} 58 | .offset8{margin-left:660px;} 59 | .offset7{margin-left:580px;} 60 | .offset6{margin-left:500px;} 61 | .offset5{margin-left:420px;} 62 | .offset4{margin-left:340px;} 63 | .offset3{margin-left:260px;} 64 | .offset2{margin-left:180px;} 65 | .offset1{margin-left:100px;} 66 | .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;} 67 | .row-fluid:after{clear:both;} 68 | .row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;} 69 | .row-fluid [class*="span"]:first-child{margin-left:0;} 70 | .row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%;} 71 | .row-fluid .span12{width:100%;*width:99.94680851063829%;} 72 | .row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%;} 73 | .row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%;} 74 | .row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%;} 75 | .row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%;} 76 | .row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%;} 77 | .row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%;} 78 | .row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%;} 79 | .row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%;} 80 | .row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%;} 81 | .row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%;} 82 | .row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%;} 83 | .row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%;} 84 | .row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%;} 85 | .row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%;} 86 | .row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%;} 87 | .row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%;} 88 | .row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%;} 89 | .row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%;} 90 | .row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%;} 91 | .row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%;} 92 | .row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%;} 93 | .row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%;} 94 | .row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%;} 95 | .row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%;} 96 | .row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%;} 97 | .row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%;} 98 | .row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%;} 99 | .row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%;} 100 | .row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%;} 101 | .row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%;} 102 | .row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%;} 103 | .row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%;} 104 | .row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%;} 105 | .row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%;} 106 | .row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%;} 107 | [class*="span"].hide,.row-fluid [class*="span"].hide{display:none;} 108 | [class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right;} 109 | .container{margin-right:auto;margin-left:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";line-height:0;} 110 | .container:after{clear:both;} 111 | .container-fluid{padding-right:20px;padding-left:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";line-height:0;} 112 | .container-fluid:after{clear:both;} 113 | p{margin:0 0 10px;} 114 | .lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px;} 115 | small{font-size:85%;} 116 | strong{font-weight:bold;} 117 | em{font-style:italic;} 118 | cite{font-style:normal;} 119 | .muted{color:#999999;} 120 | .text-warning{color:#c09853;} 121 | a.text-warning:hover{color:#a47e3c;} 122 | .text-error{color:#b94a48;} 123 | a.text-error:hover{color:#953b39;} 124 | .text-info{color:#3a87ad;} 125 | a.text-info:hover{color:#2d6987;} 126 | .text-success{color:#468847;} 127 | a.text-success:hover{color:#356635;} 128 | h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999999;} 129 | h1,h2,h3{line-height:40px;} 130 | h1{font-size:38.5px;} 131 | h2{font-size:31.5px;} 132 | h3{font-size:24.5px;} 133 | h4{font-size:17.5px;} 134 | h5{font-size:14px;} 135 | h6{font-size:11.9px;} 136 | h1 small{font-size:24.5px;} 137 | h2 small{font-size:17.5px;} 138 | h3 small{font-size:14px;} 139 | h4 small{font-size:14px;} 140 | .page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eeeeee;} 141 | ul,ol{padding:0;margin:0 0 10px 25px;} 142 | ul ul,ul ol,ol ol,ol ul{margin-bottom:0;} 143 | li{line-height:20px;} 144 | ul.unstyled,ol.unstyled{margin-left:0;list-style:none;} 145 | dl{margin-bottom:20px;} 146 | dt,dd{line-height:20px;} 147 | dt{font-weight:bold;} 148 | dd{margin-left:10px;} 149 | .dl-horizontal{*zoom:1;}.dl-horizontal:before,.dl-horizontal:after{display:table;content:"";line-height:0;} 150 | .dl-horizontal:after{clear:both;} 151 | .dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;} 152 | .dl-horizontal dd{margin-left:180px;} 153 | hr{margin:20px 0;border:0;border-top:1px solid #eeeeee;border-bottom:1px solid #ffffff;} 154 | abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999999;} 155 | abbr.initialism{font-size:90%;text-transform:uppercase;} 156 | blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:25px;} 157 | blockquote small{display:block;line-height:20px;color:#999999;}blockquote small:before{content:'\2014 \00A0';} 158 | blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eeeeee;border-left:0;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;} 159 | blockquote.pull-right small:before{content:'';} 160 | blockquote.pull-right small:after{content:'\00A0 \2014';} 161 | q:before,q:after,blockquote:before,blockquote:after{content:"";} 162 | address{display:block;margin-bottom:20px;font-style:normal;line-height:20px;} 163 | code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} 164 | code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;} 165 | pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}pre.prettyprint{margin-bottom:20px;} 166 | pre code{padding:0;color:inherit;background-color:transparent;border:0;} 167 | .pre-scrollable{max-height:340px;overflow-y:scroll;} 168 | .label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#ffffff;vertical-align:baseline;white-space:nowrap;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#999999;} 169 | .label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} 170 | .badge{padding-left:9px;padding-right:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px;} 171 | a.label:hover,a.badge:hover{color:#ffffff;text-decoration:none;cursor:pointer;} 172 | .label-important,.badge-important{background-color:#b94a48;} 173 | .label-important[href],.badge-important[href]{background-color:#953b39;} 174 | .label-warning,.badge-warning{background-color:#f89406;} 175 | .label-warning[href],.badge-warning[href]{background-color:#c67605;} 176 | .label-success,.badge-success{background-color:#468847;} 177 | .label-success[href],.badge-success[href]{background-color:#356635;} 178 | .label-info,.badge-info{background-color:#3a87ad;} 179 | .label-info[href],.badge-info[href]{background-color:#2d6987;} 180 | .label-inverse,.badge-inverse{background-color:#333333;} 181 | .label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a;} 182 | .btn .label,.btn .badge{position:relative;top:-1px;} 183 | .btn-mini .label,.btn-mini .badge{top:0;} 184 | table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0;} 185 | .table{width:100%;margin-bottom:20px;}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #dddddd;} 186 | .table th{font-weight:bold;} 187 | .table thead th{vertical-align:bottom;} 188 | .table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0;} 189 | .table tbody+tbody{border-top:2px solid #dddddd;} 190 | .table-condensed th,.table-condensed td{padding:4px 5px;} 191 | .table-bordered{border:1px solid #dddddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th,.table-bordered td{border-left:1px solid #dddddd;} 192 | .table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;} 193 | .table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px;} 194 | .table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px;} 195 | .table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child,.table-bordered tfoot:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;} 196 | .table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child,.table-bordered tfoot:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;} 197 | .table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px;} 198 | .table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px;} 199 | .table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;} 200 | .table-hover tbody tr:hover td,.table-hover tbody tr:hover th{background-color:#f5f5f5;} 201 | table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0;} 202 | .table td.span1,.table th.span1{float:none;width:44px;margin-left:0;} 203 | .table td.span2,.table th.span2{float:none;width:124px;margin-left:0;} 204 | .table td.span3,.table th.span3{float:none;width:204px;margin-left:0;} 205 | .table td.span4,.table th.span4{float:none;width:284px;margin-left:0;} 206 | .table td.span5,.table th.span5{float:none;width:364px;margin-left:0;} 207 | .table td.span6,.table th.span6{float:none;width:444px;margin-left:0;} 208 | .table td.span7,.table th.span7{float:none;width:524px;margin-left:0;} 209 | .table td.span8,.table th.span8{float:none;width:604px;margin-left:0;} 210 | .table td.span9,.table th.span9{float:none;width:684px;margin-left:0;} 211 | .table td.span10,.table th.span10{float:none;width:764px;margin-left:0;} 212 | .table td.span11,.table th.span11{float:none;width:844px;margin-left:0;} 213 | .table td.span12,.table th.span12{float:none;width:924px;margin-left:0;} 214 | .table tbody tr.success td{background-color:#dff0d8;} 215 | .table tbody tr.error td{background-color:#f2dede;} 216 | .table tbody tr.warning td{background-color:#fcf8e3;} 217 | .table tbody tr.info td{background-color:#d9edf7;} 218 | .table-hover tbody tr.success:hover td{background-color:#d0e9c6;} 219 | .table-hover tbody tr.error:hover td{background-color:#ebcccc;} 220 | .table-hover tbody tr.warning:hover td{background-color:#faf2cc;} 221 | .table-hover tbody tr.info:hover td{background-color:#c4e3f3;} 222 | form{margin:0 0 20px;} 223 | fieldset{padding:0;margin:0;border:0;} 224 | legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333333;border:0;border-bottom:1px solid #e5e5e5;}legend small{font-size:15px;color:#999999;} 225 | label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px;} 226 | input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;} 227 | label{display:block;margin-bottom:5px;} 228 | select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555555;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;vertical-align:middle;} 229 | input,textarea,.uneditable-input{width:206px;} 230 | textarea{height:auto;} 231 | textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#ffffff;border:1px solid #cccccc;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear .2s, box-shadow linear .2s;-moz-transition:border linear .2s, box-shadow linear .2s;-o-transition:border linear .2s, box-shadow linear .2s;transition:border linear .2s, box-shadow linear .2s;}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82, 168, 236, 0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);} 232 | input[type="radio"],input[type="checkbox"]{margin:4px 0 0;*margin-top:0;margin-top:1px \9;line-height:normal;cursor:pointer;} 233 | input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto;} 234 | select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px;} 235 | select{width:220px;border:1px solid #cccccc;background-color:#ffffff;} 236 | select[multiple],select[size]{height:auto;} 237 | select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} 238 | .uneditable-input,.uneditable-textarea{color:#999999;background-color:#fcfcfc;border-color:#cccccc;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;} 239 | .uneditable-input{overflow:hidden;white-space:nowrap;} 240 | .uneditable-textarea{width:auto;height:auto;} 241 | input:-moz-placeholder,textarea:-moz-placeholder{color:#999999;} 242 | input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999999;} 243 | input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999999;} 244 | .radio,.checkbox{min-height:20px;padding-left:20px;} 245 | .radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px;} 246 | .controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;} 247 | .radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle;} 248 | .radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;} 249 | .input-mini{width:60px;} 250 | .input-small{width:90px;} 251 | .input-medium{width:150px;} 252 | .input-large{width:210px;} 253 | .input-xlarge{width:270px;} 254 | .input-xxlarge{width:530px;} 255 | input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0;} 256 | .input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block;} 257 | input,textarea,.uneditable-input{margin-left:0;} 258 | .controls-row [class*="span"]+[class*="span"]{margin-left:20px;} 259 | input.span12, textarea.span12, .uneditable-input.span12{width:926px;} 260 | input.span11, textarea.span11, .uneditable-input.span11{width:846px;} 261 | input.span10, textarea.span10, .uneditable-input.span10{width:766px;} 262 | input.span9, textarea.span9, .uneditable-input.span9{width:686px;} 263 | input.span8, textarea.span8, .uneditable-input.span8{width:606px;} 264 | input.span7, textarea.span7, .uneditable-input.span7{width:526px;} 265 | input.span6, textarea.span6, .uneditable-input.span6{width:446px;} 266 | input.span5, textarea.span5, .uneditable-input.span5{width:366px;} 267 | input.span4, textarea.span4, .uneditable-input.span4{width:286px;} 268 | input.span3, textarea.span3, .uneditable-input.span3{width:206px;} 269 | input.span2, textarea.span2, .uneditable-input.span2{width:126px;} 270 | input.span1, textarea.span1, .uneditable-input.span1{width:46px;} 271 | .controls-row{*zoom:1;}.controls-row:before,.controls-row:after{display:table;content:"";line-height:0;} 272 | .controls-row:after{clear:both;} 273 | .controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left;} 274 | .controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px;} 275 | input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eeeeee;} 276 | input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent;} 277 | .control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;} 278 | .control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;} 279 | .control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;} 280 | .control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;} 281 | .control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;} 282 | .control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;} 283 | .control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;} 284 | .control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;} 285 | .control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;} 286 | .control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;} 287 | .control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;} 288 | .control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;} 289 | .control-group.info>label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad;} 290 | .control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad;} 291 | .control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;} 292 | .control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad;} 293 | input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;} 294 | .form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1;}.form-actions:before,.form-actions:after{display:table;content:"";line-height:0;} 295 | .form-actions:after{clear:both;} 296 | .help-block,.help-inline{color:#595959;} 297 | .help-block{display:block;margin-bottom:10px;} 298 | .help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px;} 299 | .input-append,.input-prepend{margin-bottom:5px;font-size:0;white-space:nowrap;}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu{font-size:14px;} 300 | .input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2;} 301 | .input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#eeeeee;border:1px solid #ccc;} 302 | .input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} 303 | .input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546;} 304 | .input-prepend .add-on,.input-prepend .btn{margin-right:-1px;} 305 | .input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;} 306 | .input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}.input-append input+.btn-group .btn,.input-append select+.btn-group .btn,.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} 307 | .input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px;} 308 | .input-append .add-on:last-child,.input-append .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} 309 | .input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} 310 | .input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;} 311 | .input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} 312 | .input-prepend.input-append .btn-group:first-child{margin-left:0;} 313 | input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} 314 | .form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} 315 | .form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px;} 316 | .form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0;} 317 | .form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0;} 318 | .form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px;} 319 | .form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;*zoom:1;margin-bottom:0;vertical-align:middle;} 320 | .form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none;} 321 | .form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block;} 322 | .form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0;} 323 | .form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle;} 324 | .form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0;} 325 | .control-group{margin-bottom:10px;} 326 | legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate;} 327 | .form-horizontal .control-group{margin-bottom:20px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";line-height:0;} 328 | .form-horizontal .control-group:after{clear:both;} 329 | .form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right;} 330 | .form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0;}.form-horizontal .controls:first-child{*padding-left:180px;} 331 | .form-horizontal .help-block{margin-bottom:0;} 332 | .form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block{margin-top:10px;} 333 | .form-horizontal .form-actions{padding-left:180px;} 334 | .btn{display:inline-block;*display:inline;*zoom:1;padding:4px 12px;margin-bottom:0;font-size:14px;line-height:20px;*line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#333333;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);background-color:#f5f5f5;background-image:-moz-linear-gradient(top, #ffffff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #ffffff, #e6e6e6);background-image:-o-linear-gradient(top, #ffffff, #e6e6e6);background-image:linear-gradient(to bottom, #ffffff, #e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#e6e6e6;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border:1px solid #bbbbbb;*border:0;border-bottom-color:#a2a2a2;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*margin-left:.3em;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333333;background-color:#e6e6e6;*background-color:#d9d9d9;} 335 | .btn:active,.btn.active{background-color:#cccccc \9;} 336 | .btn:first-child{*margin-left:0;} 337 | .btn:hover{color:#333333;text-decoration:none;background-color:#e6e6e6;*background-color:#d9d9d9;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;} 338 | .btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} 339 | .btn.active,.btn:active{background-color:#e6e6e6;background-color:#d9d9d9 \9;background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);} 340 | .btn.disabled,.btn[disabled]{cursor:default;background-color:#e6e6e6;background-image:none;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} 341 | .btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} 342 | .btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:2px;} 343 | .btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} 344 | .btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0;} 345 | .btn-mini{padding:1px 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} 346 | .btn-block{display:block;width:100%;padding-left:0;padding-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} 347 | .btn-block+.btn-block{margin-top:5px;} 348 | input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%;} 349 | .btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255, 255, 255, 0.75);} 350 | .btn{border-color:#c5c5c5;border-color:rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25);} 351 | .btn-primary{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#006dcc;background-image:-moz-linear-gradient(top, #0088cc, #0044cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));background-image:-webkit-linear-gradient(top, #0088cc, #0044cc);background-image:-o-linear-gradient(top, #0088cc, #0044cc);background-image:linear-gradient(to bottom, #0088cc, #0044cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#0044cc;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#ffffff;background-color:#0044cc;*background-color:#003bb3;} 352 | .btn-primary:active,.btn-primary.active{background-color:#003399 \9;} 353 | .btn-warning{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(to bottom, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#f89406;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#ffffff;background-color:#f89406;*background-color:#df8505;} 354 | .btn-warning:active,.btn-warning.active{background-color:#c67605 \9;} 355 | .btn-danger{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(to bottom, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#bd362f;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#ffffff;background-color:#bd362f;*background-color:#a9302a;} 356 | .btn-danger:active,.btn-danger.active{background-color:#942a25 \9;} 357 | .btn-success{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(to bottom, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#51a351;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#ffffff;background-color:#51a351;*background-color:#499249;} 358 | .btn-success:active,.btn-success.active{background-color:#408140 \9;} 359 | .btn-info{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(to bottom, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#2f96b4;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#ffffff;background-color:#2f96b4;*background-color:#2a85a0;} 360 | .btn-info:active,.btn-info.active{background-color:#24748c \9;} 361 | .btn-inverse{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#363636;background-image:-moz-linear-gradient(top, #444444, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));background-image:-webkit-linear-gradient(top, #444444, #222222);background-image:-o-linear-gradient(top, #444444, #222222);background-image:linear-gradient(to bottom, #444444, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#222222;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#ffffff;background-color:#222222;*background-color:#151515;} 362 | .btn-inverse:active,.btn-inverse.active{background-color:#080808 \9;} 363 | button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;} 364 | button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px;} 365 | button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px;} 366 | button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px;} 367 | .btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} 368 | .btn-link{border-color:transparent;cursor:pointer;color:#0088cc;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} 369 | .btn-link:hover{color:#005580;text-decoration:underline;background-color:transparent;} 370 | .btn-link[disabled]:hover{color:#333333;text-decoration:none;} 371 | [class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat;margin-top:1px;} 372 | .icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png");} 373 | .icon-glass{background-position:0 0;} 374 | .icon-music{background-position:-24px 0;} 375 | .icon-search{background-position:-48px 0;} 376 | .icon-envelope{background-position:-72px 0;} 377 | .icon-heart{background-position:-96px 0;} 378 | .icon-star{background-position:-120px 0;} 379 | .icon-star-empty{background-position:-144px 0;} 380 | .icon-user{background-position:-168px 0;} 381 | .icon-film{background-position:-192px 0;} 382 | .icon-th-large{background-position:-216px 0;} 383 | .icon-th{background-position:-240px 0;} 384 | .icon-th-list{background-position:-264px 0;} 385 | .icon-ok{background-position:-288px 0;} 386 | .icon-remove{background-position:-312px 0;} 387 | .icon-zoom-in{background-position:-336px 0;} 388 | .icon-zoom-out{background-position:-360px 0;} 389 | .icon-off{background-position:-384px 0;} 390 | .icon-signal{background-position:-408px 0;} 391 | .icon-cog{background-position:-432px 0;} 392 | .icon-trash{background-position:-456px 0;} 393 | .icon-home{background-position:0 -24px;} 394 | .icon-file{background-position:-24px -24px;} 395 | .icon-time{background-position:-48px -24px;} 396 | .icon-road{background-position:-72px -24px;} 397 | .icon-download-alt{background-position:-96px -24px;} 398 | .icon-download{background-position:-120px -24px;} 399 | .icon-upload{background-position:-144px -24px;} 400 | .icon-inbox{background-position:-168px -24px;} 401 | .icon-play-circle{background-position:-192px -24px;} 402 | .icon-repeat{background-position:-216px -24px;} 403 | .icon-refresh{background-position:-240px -24px;} 404 | .icon-list-alt{background-position:-264px -24px;} 405 | .icon-lock{background-position:-287px -24px;} 406 | .icon-flag{background-position:-312px -24px;} 407 | .icon-headphones{background-position:-336px -24px;} 408 | .icon-volume-off{background-position:-360px -24px;} 409 | .icon-volume-down{background-position:-384px -24px;} 410 | .icon-volume-up{background-position:-408px -24px;} 411 | .icon-qrcode{background-position:-432px -24px;} 412 | .icon-barcode{background-position:-456px -24px;} 413 | .icon-tag{background-position:0 -48px;} 414 | .icon-tags{background-position:-25px -48px;} 415 | .icon-book{background-position:-48px -48px;} 416 | .icon-bookmark{background-position:-72px -48px;} 417 | .icon-print{background-position:-96px -48px;} 418 | .icon-camera{background-position:-120px -48px;} 419 | .icon-font{background-position:-144px -48px;} 420 | .icon-bold{background-position:-167px -48px;} 421 | .icon-italic{background-position:-192px -48px;} 422 | .icon-text-height{background-position:-216px -48px;} 423 | .icon-text-width{background-position:-240px -48px;} 424 | .icon-align-left{background-position:-264px -48px;} 425 | .icon-align-center{background-position:-288px -48px;} 426 | .icon-align-right{background-position:-312px -48px;} 427 | .icon-align-justify{background-position:-336px -48px;} 428 | .icon-list{background-position:-360px -48px;} 429 | .icon-indent-left{background-position:-384px -48px;} 430 | .icon-indent-right{background-position:-408px -48px;} 431 | .icon-facetime-video{background-position:-432px -48px;} 432 | .icon-picture{background-position:-456px -48px;} 433 | .icon-pencil{background-position:0 -72px;} 434 | .icon-map-marker{background-position:-24px -72px;} 435 | .icon-adjust{background-position:-48px -72px;} 436 | .icon-tint{background-position:-72px -72px;} 437 | .icon-edit{background-position:-96px -72px;} 438 | .icon-share{background-position:-120px -72px;} 439 | .icon-check{background-position:-144px -72px;} 440 | .icon-move{background-position:-168px -72px;} 441 | .icon-step-backward{background-position:-192px -72px;} 442 | .icon-fast-backward{background-position:-216px -72px;} 443 | .icon-backward{background-position:-240px -72px;} 444 | .icon-play{background-position:-264px -72px;} 445 | .icon-pause{background-position:-288px -72px;} 446 | .icon-stop{background-position:-312px -72px;} 447 | .icon-forward{background-position:-336px -72px;} 448 | .icon-fast-forward{background-position:-360px -72px;} 449 | .icon-step-forward{background-position:-384px -72px;} 450 | .icon-eject{background-position:-408px -72px;} 451 | .icon-chevron-left{background-position:-432px -72px;} 452 | .icon-chevron-right{background-position:-456px -72px;} 453 | .icon-plus-sign{background-position:0 -96px;} 454 | .icon-minus-sign{background-position:-24px -96px;} 455 | .icon-remove-sign{background-position:-48px -96px;} 456 | .icon-ok-sign{background-position:-72px -96px;} 457 | .icon-question-sign{background-position:-96px -96px;} 458 | .icon-info-sign{background-position:-120px -96px;} 459 | .icon-screenshot{background-position:-144px -96px;} 460 | .icon-remove-circle{background-position:-168px -96px;} 461 | .icon-ok-circle{background-position:-192px -96px;} 462 | .icon-ban-circle{background-position:-216px -96px;} 463 | .icon-arrow-left{background-position:-240px -96px;} 464 | .icon-arrow-right{background-position:-264px -96px;} 465 | .icon-arrow-up{background-position:-289px -96px;} 466 | .icon-arrow-down{background-position:-312px -96px;} 467 | .icon-share-alt{background-position:-336px -96px;} 468 | .icon-resize-full{background-position:-360px -96px;} 469 | .icon-resize-small{background-position:-384px -96px;} 470 | .icon-plus{background-position:-408px -96px;} 471 | .icon-minus{background-position:-433px -96px;} 472 | .icon-asterisk{background-position:-456px -96px;} 473 | .icon-exclamation-sign{background-position:0 -120px;} 474 | .icon-gift{background-position:-24px -120px;} 475 | .icon-leaf{background-position:-48px -120px;} 476 | .icon-fire{background-position:-72px -120px;} 477 | .icon-eye-open{background-position:-96px -120px;} 478 | .icon-eye-close{background-position:-120px -120px;} 479 | .icon-warning-sign{background-position:-144px -120px;} 480 | .icon-plane{background-position:-168px -120px;} 481 | .icon-calendar{background-position:-192px -120px;} 482 | .icon-random{background-position:-216px -120px;width:16px;} 483 | .icon-comment{background-position:-240px -120px;} 484 | .icon-magnet{background-position:-264px -120px;} 485 | .icon-chevron-up{background-position:-288px -120px;} 486 | .icon-chevron-down{background-position:-313px -119px;} 487 | .icon-retweet{background-position:-336px -120px;} 488 | .icon-shopping-cart{background-position:-360px -120px;} 489 | .icon-folder-close{background-position:-384px -120px;} 490 | .icon-folder-open{background-position:-408px -120px;width:16px;} 491 | .icon-resize-vertical{background-position:-432px -119px;} 492 | .icon-resize-horizontal{background-position:-456px -118px;} 493 | .icon-hdd{background-position:0 -144px;} 494 | .icon-bullhorn{background-position:-24px -144px;} 495 | .icon-bell{background-position:-48px -144px;} 496 | .icon-certificate{background-position:-72px -144px;} 497 | .icon-thumbs-up{background-position:-96px -144px;} 498 | .icon-thumbs-down{background-position:-120px -144px;} 499 | .icon-hand-right{background-position:-144px -144px;} 500 | .icon-hand-left{background-position:-168px -144px;} 501 | .icon-hand-up{background-position:-192px -144px;} 502 | .icon-hand-down{background-position:-216px -144px;} 503 | .icon-circle-arrow-right{background-position:-240px -144px;} 504 | .icon-circle-arrow-left{background-position:-264px -144px;} 505 | .icon-circle-arrow-up{background-position:-288px -144px;} 506 | .icon-circle-arrow-down{background-position:-312px -144px;} 507 | .icon-globe{background-position:-336px -144px;} 508 | .icon-wrench{background-position:-360px -144px;} 509 | .icon-tasks{background-position:-384px -144px;} 510 | .icon-filter{background-position:-408px -144px;} 511 | .icon-briefcase{background-position:-432px -144px;} 512 | .icon-fullscreen{background-position:-456px -144px;} 513 | .btn-group{position:relative;display:inline-block;*display:inline;*zoom:1;font-size:0;vertical-align:middle;white-space:nowrap;*margin-left:.3em;}.btn-group:first-child{*margin-left:0;} 514 | .btn-group+.btn-group{margin-left:5px;} 515 | .btn-toolbar{font-size:0;margin-top:10px;margin-bottom:10px;}.btn-toolbar .btn+.btn,.btn-toolbar .btn-group+.btn,.btn-toolbar .btn+.btn-group{margin-left:5px;} 516 | .btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} 517 | .btn-group>.btn+.btn{margin-left:-1px;} 518 | .btn-group>.btn,.btn-group>.dropdown-menu{font-size:14px;} 519 | .btn-group>.btn-mini{font-size:11px;} 520 | .btn-group>.btn-small{font-size:12px;} 521 | .btn-group>.btn-large{font-size:16px;} 522 | .btn-group>.btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} 523 | .btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;} 524 | .btn-group>.btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;} 525 | .btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;} 526 | .btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2;} 527 | .btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;} 528 | .btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);*padding-top:5px;*padding-bottom:5px;} 529 | .btn-group>.btn-mini+.dropdown-toggle{padding-left:5px;padding-right:5px;*padding-top:2px;*padding-bottom:2px;} 530 | .btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px;} 531 | .btn-group>.btn-large+.dropdown-toggle{padding-left:12px;padding-right:12px;*padding-top:7px;*padding-bottom:7px;} 532 | .btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);} 533 | .btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6;} 534 | .btn-group.open .btn-primary.dropdown-toggle{background-color:#0044cc;} 535 | .btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406;} 536 | .btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f;} 537 | .btn-group.open .btn-success.dropdown-toggle{background-color:#51a351;} 538 | .btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4;} 539 | .btn-group.open .btn-inverse.dropdown-toggle{background-color:#222222;} 540 | .btn .caret{margin-top:8px;margin-left:0;} 541 | .btn-mini .caret,.btn-small .caret,.btn-large .caret{margin-top:6px;} 542 | .btn-large .caret{border-left-width:5px;border-right-width:5px;border-top-width:5px;} 543 | .dropup .btn-large .caret{border-bottom-width:5px;} 544 | .btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;} 545 | .btn-group-vertical{display:inline-block;*display:inline;*zoom:1;} 546 | .btn-group-vertical .btn{display:block;float:none;width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} 547 | .btn-group-vertical .btn+.btn{margin-left:0;margin-top:-1px;} 548 | .btn-group-vertical .btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;} 549 | .btn-group-vertical .btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;} 550 | .btn-group-vertical .btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0;} 551 | .btn-group-vertical .btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;} 552 | .nav{margin-left:0;margin-bottom:20px;list-style:none;} 553 | .nav>li>a{display:block;} 554 | .nav>li>a:hover{text-decoration:none;background-color:#eeeeee;} 555 | .nav>.pull-right{float:right;} 556 | .nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999999;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);text-transform:uppercase;} 557 | .nav li+.nav-header{margin-top:9px;} 558 | .nav-list{padding-left:15px;padding-right:15px;margin-bottom:0;} 559 | .nav-list>li>a,.nav-list .nav-header{margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);} 560 | .nav-list>li>a{padding:3px 15px;} 561 | .nav-list>.active>a,.nav-list>.active>a:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0088cc;} 562 | .nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px;} 563 | .nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;} 564 | .nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";line-height:0;} 565 | .nav-tabs:after,.nav-pills:after{clear:both;} 566 | .nav-tabs>li,.nav-pills>li{float:left;} 567 | .nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;} 568 | .nav-tabs{border-bottom:1px solid #ddd;} 569 | .nav-tabs>li{margin-bottom:-1px;} 570 | .nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd;} 571 | .nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;} 572 | .nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} 573 | .nav-pills>.active>a,.nav-pills>.active>a:hover{color:#ffffff;background-color:#0088cc;} 574 | .nav-stacked>li{float:none;} 575 | .nav-stacked>li>a{margin-right:0;} 576 | .nav-tabs.nav-stacked{border-bottom:0;} 577 | .nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} 578 | .nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;} 579 | .nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} 580 | .nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2;} 581 | .nav-pills.nav-stacked>li>a{margin-bottom:3px;} 582 | .nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;} 583 | .nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;} 584 | .nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} 585 | .nav .dropdown-toggle .caret{border-top-color:#0088cc;border-bottom-color:#0088cc;margin-top:6px;} 586 | .nav .dropdown-toggle:hover .caret{border-top-color:#005580;border-bottom-color:#005580;} 587 | .nav-tabs .dropdown-toggle .caret{margin-top:8px;} 588 | .nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff;} 589 | .nav-tabs .active .dropdown-toggle .caret{border-top-color:#555555;border-bottom-color:#555555;} 590 | .nav>.dropdown.active>a:hover{cursor:pointer;} 591 | .nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{color:#ffffff;background-color:#999999;border-color:#999999;} 592 | .nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;opacity:1;filter:alpha(opacity=100);} 593 | .tabs-stacked .open>a:hover{border-color:#999999;} 594 | .tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";line-height:0;} 595 | .tabbable:after{clear:both;} 596 | .tab-content{overflow:auto;} 597 | .tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0;} 598 | .tab-content>.tab-pane,.pill-content>.pill-pane{display:none;} 599 | .tab-content>.active,.pill-content>.active{display:block;} 600 | .tabs-below>.nav-tabs{border-top:1px solid #ddd;} 601 | .tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0;} 602 | .tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below>.nav-tabs>li>a:hover{border-bottom-color:transparent;border-top-color:#ddd;} 603 | .tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover{border-color:transparent #ddd #ddd #ddd;} 604 | .tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none;} 605 | .tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;} 606 | .tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;} 607 | .tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;} 608 | .tabs-left>.nav-tabs>li>a:hover{border-color:#eeeeee #dddddd #eeeeee #eeeeee;} 609 | .tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;} 610 | .tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;} 611 | .tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} 612 | .tabs-right>.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #eeeeee #dddddd;} 613 | .tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;} 614 | .nav>.disabled>a{color:#999999;} 615 | .nav>.disabled>a:hover{text-decoration:none;background-color:transparent;cursor:default;} 616 | .navbar{overflow:visible;margin-bottom:20px;color:#777777;*position:relative;*z-index:2;} 617 | .navbar-inner{min-height:40px;padding-left:20px;padding-right:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top, #ffffff, #f2f2f2);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));background-image:-webkit-linear-gradient(top, #ffffff, #f2f2f2);background-image:-o-linear-gradient(top, #ffffff, #f2f2f2);background-image:linear-gradient(to bottom, #ffffff, #f2f2f2);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 4px rgba(0, 0, 0, 0.065);-moz-box-shadow:0 1px 4px rgba(0, 0, 0, 0.065);box-shadow:0 1px 4px rgba(0, 0, 0, 0.065);*zoom:1;}.navbar-inner:before,.navbar-inner:after{display:table;content:"";line-height:0;} 618 | .navbar-inner:after{clear:both;} 619 | .navbar .container{width:auto;} 620 | .nav-collapse.collapse{height:auto;overflow:visible;} 621 | .navbar .brand{float:left;display:block;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777777;text-shadow:0 1px 0 #ffffff;}.navbar .brand:hover{text-decoration:none;} 622 | .navbar-text{margin-bottom:0;line-height:40px;} 623 | .navbar-link{color:#777777;}.navbar-link:hover{color:#333333;} 624 | .navbar .divider-vertical{height:40px;margin:0 9px;border-left:1px solid #f2f2f2;border-right:1px solid #ffffff;} 625 | .navbar .btn,.navbar .btn-group{margin-top:5px;} 626 | .navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn{margin-top:0;} 627 | .navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";line-height:0;} 628 | .navbar-form:after{clear:both;} 629 | .navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;} 630 | .navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0;} 631 | .navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;} 632 | .navbar-form .input-append,.navbar-form .input-prepend{margin-top:6px;white-space:nowrap;}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0;} 633 | .navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0;}.navbar-search .search-query{margin-bottom:0;padding:4px 14px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} 634 | .navbar-static-top{position:static;margin-bottom:0;}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} 635 | .navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0;} 636 | .navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px;} 637 | .navbar-fixed-bottom .navbar-inner{border-width:1px 0 0;} 638 | .navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} 639 | .navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;} 640 | .navbar-fixed-top{top:0;} 641 | .navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,.1);box-shadow:0 1px 10px rgba(0,0,0,.1);} 642 | .navbar-fixed-bottom{bottom:0;}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,.1);box-shadow:0 -1px 10px rgba(0,0,0,.1);} 643 | .navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;} 644 | .navbar .nav.pull-right{float:right;margin-right:0;} 645 | .navbar .nav>li{float:left;} 646 | .navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777777;text-decoration:none;text-shadow:0 1px 0 #ffffff;} 647 | .navbar .nav .dropdown-toggle .caret{margin-top:8px;} 648 | .navbar .nav>li>a:focus,.navbar .nav>li>a:hover{background-color:transparent;color:#333333;text-decoration:none;} 649 | .navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);-moz-box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);} 650 | .navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#ededed;background-image:-moz-linear-gradient(top, #f2f2f2, #e5e5e5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5));background-image:-webkit-linear-gradient(top, #f2f2f2, #e5e5e5);background-image:-o-linear-gradient(top, #f2f2f2, #e5e5e5);background-image:linear-gradient(to bottom, #f2f2f2, #e5e5e5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#e5e5e5;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);}.navbar .btn-navbar:hover,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#ffffff;background-color:#e5e5e5;*background-color:#d9d9d9;} 651 | .navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#cccccc \9;} 652 | .navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);} 653 | .btn-navbar .icon-bar+.icon-bar{margin-top:3px;} 654 | .navbar .nav>li>.dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;} 655 | .navbar .nav>li>.dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;} 656 | .navbar-fixed-bottom .nav>li>.dropdown-menu:before{border-top:7px solid #ccc;border-top-color:rgba(0, 0, 0, 0.2);border-bottom:0;bottom:-7px;top:auto;} 657 | .navbar-fixed-bottom .nav>li>.dropdown-menu:after{border-top:6px solid #ffffff;border-bottom:0;bottom:-6px;top:auto;} 658 | .navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{background-color:#e5e5e5;color:#555555;} 659 | .navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777777;border-bottom-color:#777777;} 660 | .navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555555;border-bottom-color:#555555;} 661 | .navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{left:auto;right:0;}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{left:auto;right:12px;} 662 | .navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{left:auto;right:13px;} 663 | .navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{left:auto;right:100%;margin-left:0;margin-right:-1px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px;} 664 | .navbar-inverse{color:#999999;}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top, #222222, #111111);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));background-image:-webkit-linear-gradient(top, #222222, #111111);background-image:-o-linear-gradient(top, #222222, #111111);background-image:linear-gradient(to bottom, #222222, #111111);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);border-color:#252525;} 665 | .navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999999;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover{color:#ffffff;} 666 | .navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{background-color:transparent;color:#ffffff;} 667 | .navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#ffffff;background-color:#111111;} 668 | .navbar-inverse .navbar-link{color:#999999;}.navbar-inverse .navbar-link:hover{color:#ffffff;} 669 | .navbar-inverse .divider-vertical{border-left-color:#111111;border-right-color:#222222;} 670 | .navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{background-color:#111111;color:#ffffff;} 671 | .navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999999;border-bottom-color:#999999;} 672 | .navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;} 673 | .navbar-inverse .navbar-search .search-query{color:#ffffff;background-color:#515151;border-color:#111111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none;}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#cccccc;} 674 | .navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#cccccc;} 675 | .navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#cccccc;} 676 | .navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;} 677 | .navbar-inverse .btn-navbar{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e0e0e;background-image:-moz-linear-gradient(top, #151515, #040404);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));background-image:-webkit-linear-gradient(top, #151515, #040404);background-image:-o-linear-gradient(top, #151515, #040404);background-image:linear-gradient(to bottom, #151515, #040404);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);border-color:#040404 #040404 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#040404;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#ffffff;background-color:#040404;*background-color:#000000;} 678 | .navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000000 \9;} 679 | .breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.breadcrumb li{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 0 #ffffff;} 680 | .breadcrumb .divider{padding:0 5px;color:#ccc;} 681 | .breadcrumb .active{color:#999999;} 682 | .pagination{margin:20px 0;} 683 | .pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);} 684 | .pagination ul>li{display:inline;} 685 | .pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#ffffff;border:1px solid #dddddd;border-left-width:0;} 686 | .pagination ul>li>a:hover,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5;} 687 | .pagination ul>.active>a,.pagination ul>.active>span{color:#999999;cursor:default;} 688 | .pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover{color:#999999;background-color:transparent;cursor:default;} 689 | .pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} 690 | .pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;} 691 | .pagination-centered{text-align:center;} 692 | .pagination-right{text-align:right;} 693 | .pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px;} 694 | .pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;} 695 | .pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;} 696 | .pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-top-left-radius:3px;-moz-border-radius-topleft:3px;border-top-left-radius:3px;-webkit-border-bottom-left-radius:3px;-moz-border-radius-bottomleft:3px;border-bottom-left-radius:3px;} 697 | .pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;-moz-border-radius-topright:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;-moz-border-radius-bottomright:3px;border-bottom-right-radius:3px;} 698 | .pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px;} 699 | .pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:1px 6px;font-size:10.5px;} 700 | .pager{margin:20px 0;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";line-height:0;} 701 | .pager:after{clear:both;} 702 | .pager li{display:inline;} 703 | .pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} 704 | .pager li>a:hover{text-decoration:none;background-color:#f5f5f5;} 705 | .pager .next>a,.pager .next>span{float:right;} 706 | .pager .previous>a,.pager .previous>span{float:left;} 707 | .pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>span{color:#999999;background-color:#fff;cursor:default;} 708 | .thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";line-height:0;} 709 | .thumbnails:after{clear:both;} 710 | .row-fluid .thumbnails{margin-left:0;} 711 | .thumbnails>li{float:left;margin-bottom:20px;margin-left:20px;} 712 | .thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);-webkit-transition:all 0.2s ease-in-out;-moz-transition:all 0.2s ease-in-out;-o-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;} 713 | a.thumbnail:hover{border-color:#0088cc;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);} 714 | .thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;} 715 | .thumbnail .caption{padding:9px;color:#555555;} 716 | .alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;color:#c09853;} 717 | .alert h4{margin:0;} 718 | .alert .close{position:relative;top:-2px;right:-21px;line-height:20px;} 719 | .alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#468847;} 720 | .alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;color:#b94a48;} 721 | .alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#3a87ad;} 722 | .alert-block{padding-top:14px;padding-bottom:14px;} 723 | .alert-block>p,.alert-block>ul{margin-bottom:0;} 724 | .alert-block p+p{margin-top:5px;} 725 | @-webkit-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-o-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));background-image:-webkit-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-o-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:linear-gradient(to bottom, #f5f5f5, #f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} 726 | .progress .bar{width:0%;height:100%;color:#ffffff;float:left;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(to bottom, #149bdf, #0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width 0.6s ease;-moz-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease;} 727 | .progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);} 728 | .progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;} 729 | .progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;} 730 | .progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(to bottom, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);} 731 | .progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} 732 | .progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(to bottom, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);} 733 | .progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} 734 | .progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(to bottom, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);} 735 | .progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} 736 | .progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(to bottom, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);} 737 | .progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} 738 | .hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eeeeee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;color:inherit;letter-spacing:-1px;} 739 | .hero-unit li{line-height:30px;} 740 | .media,.media-body{overflow:hidden;*overflow:visible;zoom:1;} 741 | .media,.media .media{margin-top:15px;} 742 | .media:first-child{margin-top:0;} 743 | .media-object{display:block;} 744 | .media-heading{margin:0 0 5px;} 745 | .media .pull-left{margin-right:10px;} 746 | .media .pull-right{margin-left:10px;} 747 | .media-list{margin-left:0;list-style:none;} 748 | .tooltip{position:absolute;z-index:1030;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);} 749 | .tooltip.top{margin-top:-3px;} 750 | .tooltip.right{margin-left:3px;} 751 | .tooltip.bottom{margin-top:3px;} 752 | .tooltip.left{margin-left:-3px;} 753 | .tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} 754 | .tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid;} 755 | .tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000000;} 756 | .tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000000;} 757 | .tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000000;} 758 | .tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000000;} 759 | .popover{position:absolute;top:0;left:0;z-index:1010;display:none;width:236px;padding:1px;background-color:#ffffff;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);}.popover.top{margin-top:-10px;} 760 | .popover.right{margin-left:10px;} 761 | .popover.bottom{margin-top:10px;} 762 | .popover.left{margin-left:-10px;} 763 | .popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0;} 764 | .popover-content{padding:9px 14px;}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0;} 765 | .popover .arrow,.popover .arrow:after{position:absolute;display:inline-block;width:0;height:0;border-color:transparent;border-style:solid;} 766 | .popover .arrow:after{content:"";z-index:-1;} 767 | .popover.top .arrow{bottom:-10px;left:50%;margin-left:-10px;border-width:10px 10px 0;border-top-color:#ffffff;}.popover.top .arrow:after{border-width:11px 11px 0;border-top-color:rgba(0, 0, 0, 0.25);bottom:-1px;left:-11px;} 768 | .popover.right .arrow{top:50%;left:-10px;margin-top:-10px;border-width:10px 10px 10px 0;border-right-color:#ffffff;}.popover.right .arrow:after{border-width:11px 11px 11px 0;border-right-color:rgba(0, 0, 0, 0.25);bottom:-11px;left:-1px;} 769 | .popover.bottom .arrow{top:-10px;left:50%;margin-left:-10px;border-width:0 10px 10px;border-bottom-color:#ffffff;}.popover.bottom .arrow:after{border-width:0 11px 11px;border-bottom-color:rgba(0, 0, 0, 0.25);top:-1px;left:-11px;} 770 | .popover.left .arrow{top:50%;right:-10px;margin-top:-10px;border-width:10px 0 10px 10px;border-left-color:#ffffff;}.popover.left .arrow:after{border-width:11px 0 11px 11px;border-left-color:rgba(0, 0, 0, 0.25);bottom:-11px;right:-1px;} 771 | .modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;} 772 | .modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);} 773 | .modal{position:fixed;top:50%;left:50%;z-index:1050;width:560px;margin:-250px 0 0 -280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;outline:none;}.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;} 774 | .modal.fade.in{top:50%;} 775 | .modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;} 776 | .modal-header h3{margin:0;line-height:30px;} 777 | .modal-body{overflow-y:auto;max-height:400px;padding:15px;} 778 | .modal-form{margin-bottom:0;} 779 | .modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;}.modal-footer:before,.modal-footer:after{display:table;content:"";line-height:0;} 780 | .modal-footer:after{clear:both;} 781 | .modal-footer .btn+.btn{margin-left:5px;margin-bottom:0;} 782 | .modal-footer .btn-group .btn+.btn{margin-left:-1px;} 783 | .modal-footer .btn-block+.btn-block{margin-left:0;} 784 | .dropup,.dropdown{position:relative;} 785 | .dropdown-toggle{*margin-bottom:-3px;} 786 | .dropdown-toggle:active,.open .dropdown-toggle{outline:0;} 787 | .caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000000;border-right:4px solid transparent;border-left:4px solid transparent;content:"";} 788 | .dropdown .caret{margin-top:8px;margin-left:2px;} 789 | .dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#ffffff;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;}.dropdown-menu.pull-right{right:0;left:auto;} 790 | .dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;} 791 | .dropdown-menu li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333333;white-space:nowrap;} 792 | .dropdown-menu li>a:hover,.dropdown-menu li>a:focus,.dropdown-submenu:hover>a{text-decoration:none;color:#ffffff;background-color:#0081c2;background-image:-moz-linear-gradient(top, #0088cc, #0077b3);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));background-image:-webkit-linear-gradient(top, #0088cc, #0077b3);background-image:-o-linear-gradient(top, #0088cc, #0077b3);background-image:linear-gradient(to bottom, #0088cc, #0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);} 793 | .dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#333333;text-decoration:none;outline:0;background-color:#0081c2;background-image:-moz-linear-gradient(top, #0088cc, #0077b3);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));background-image:-webkit-linear-gradient(top, #0088cc, #0077b3);background-image:-o-linear-gradient(top, #0088cc, #0077b3);background-image:linear-gradient(to bottom, #0088cc, #0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);} 794 | .dropdown-menu .disabled>a,.dropdown-menu .disabled>a:hover{color:#999999;} 795 | .dropdown-menu .disabled>a:hover{text-decoration:none;background-color:transparent;background-image:none;cursor:default;} 796 | .open{*z-index:1000;}.open >.dropdown-menu{display:block;} 797 | .pull-right>.dropdown-menu{right:0;left:auto;} 798 | .dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000000;content:"";} 799 | .dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px;} 800 | .dropdown-submenu{position:relative;} 801 | .dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px;} 802 | .dropdown-submenu:hover>.dropdown-menu{display:block;} 803 | .dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0;} 804 | .dropdown-submenu>a:after{display:block;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#cccccc;margin-top:5px;margin-right:-10px;} 805 | .dropdown-submenu:hover>a:after{border-left-color:#ffffff;} 806 | .dropdown-submenu.pull-left{float:none;}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px;} 807 | .dropdown .dropdown-menu .nav-header{padding-left:20px;padding-right:20px;} 808 | .typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} 809 | .accordion{margin-bottom:20px;} 810 | .accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} 811 | .accordion-heading{border-bottom:0;} 812 | .accordion-heading .accordion-toggle{display:block;padding:8px 15px;} 813 | .accordion-toggle{cursor:pointer;} 814 | .accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;} 815 | .carousel{position:relative;margin-bottom:20px;line-height:1;} 816 | .carousel-inner{overflow:hidden;width:100%;position:relative;} 817 | .carousel .item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;} 818 | .carousel .item>img{display:block;line-height:1;} 819 | .carousel .active,.carousel .next,.carousel .prev{display:block;} 820 | .carousel .active{left:0;} 821 | .carousel .next,.carousel .prev{position:absolute;top:0;width:100%;} 822 | .carousel .next{left:100%;} 823 | .carousel .prev{left:-100%;} 824 | .carousel .next.left,.carousel .prev.right{left:0;} 825 | .carousel .active.left{left:-100%;} 826 | .carousel .active.right{left:100%;} 827 | .carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);}.carousel-control.right{left:auto;right:15px;} 828 | .carousel-control:hover{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);} 829 | .carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:15px;background:#333333;background:rgba(0, 0, 0, 0.75);} 830 | .carousel-caption h4,.carousel-caption p{color:#ffffff;line-height:20px;} 831 | .carousel-caption h4{margin:0 0 5px;} 832 | .carousel-caption p{margin-bottom:0;} 833 | .media,.media-body{overflow:hidden;*overflow:visible;zoom:1;} 834 | .media,.media .media{margin-top:15px;} 835 | .media:first-child{margin-top:0;} 836 | .media-object{display:block;} 837 | .media-heading{margin:0 0 5px;} 838 | .media .pull-left{margin-right:10px;} 839 | .media .pull-right{margin-left:10px;} 840 | .media-list{margin-left:0;list-style:none;} 841 | .well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);} 842 | .well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} 843 | .well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} 844 | .close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover{color:#000000;text-decoration:none;cursor:pointer;opacity:0.4;filter:alpha(opacity=40);} 845 | button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none;} 846 | .pull-right{float:right;} 847 | .pull-left{float:left;} 848 | .hide{display:none;} 849 | .show{display:block;} 850 | .invisible{visibility:hidden;} 851 | .affix{position:fixed;} 852 | .fade{opacity:0;-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;}.fade.in{opacity:1;} 853 | .collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;}.collapse.in{height:auto;} 854 | .hidden{display:none;visibility:hidden;} 855 | .visible-phone{display:none !important;} 856 | .visible-tablet{display:none !important;} 857 | .hidden-desktop{display:none !important;} 858 | .visible-desktop{display:inherit !important;} 859 | @media (min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit !important;} .visible-desktop{display:none !important ;} .visible-tablet{display:inherit !important;} .hidden-tablet{display:none !important;}}@media (max-width:767px){.hidden-desktop{display:inherit !important;} .visible-desktop{display:none !important;} .visible-phone{display:inherit !important;} .hidden-phone{display:none !important;}}@media (max-width:767px){body{padding-left:20px;padding-right:20px;} .navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-left:-20px;margin-right:-20px;} .container-fluid{padding:0;} .dl-horizontal dt{float:none;clear:none;width:auto;text-align:left;} .dl-horizontal dd{margin-left:0;} .container{width:auto;} .row-fluid{width:100%;} .row,.thumbnails{margin-left:0;} .thumbnails>li{float:none;margin-left:0;} [class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{float:none;display:block;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} .span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} .row-fluid [class*="offset"]:first-child{margin-left:0;} .input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} .input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto;} .controls-row [class*="span"]+[class*="span"]{margin-left:0;} .modal{position:fixed;top:20px;left:20px;right:20px;width:auto;margin:0;}.modal.fade{top:-100px;} .modal.fade.in{top:20px;}}@media (max-width:480px){.nav-collapse{-webkit-transform:translate3d(0, 0, 0);} .page-header h1 small{display:block;line-height:20px;} input[type="checkbox"],input[type="radio"]{border:1px solid #ccc;} .form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left;} .form-horizontal .controls{margin-left:0;} .form-horizontal .control-list{padding-top:0;} .form-horizontal .form-actions{padding-left:10px;padding-right:10px;} .media .pull-left,.media .pull-right{float:none;display:block;margin-bottom:10px;} .media-object{margin-right:0;margin-left:0;} .modal{top:10px;left:10px;right:10px;} .modal-header .close{padding:10px;margin:-10px;} .carousel-caption{position:static;}}@media (min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";line-height:0;} .row:after{clear:both;} [class*="span"]{float:left;min-height:1px;margin-left:20px;} .container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px;} .span12{width:724px;} .span11{width:662px;} .span10{width:600px;} .span9{width:538px;} .span8{width:476px;} .span7{width:414px;} .span6{width:352px;} .span5{width:290px;} .span4{width:228px;} .span3{width:166px;} .span2{width:104px;} .span1{width:42px;} .offset12{margin-left:764px;} .offset11{margin-left:702px;} .offset10{margin-left:640px;} .offset9{margin-left:578px;} .offset8{margin-left:516px;} .offset7{margin-left:454px;} .offset6{margin-left:392px;} .offset5{margin-left:330px;} .offset4{margin-left:268px;} .offset3{margin-left:206px;} .offset2{margin-left:144px;} .offset1{margin-left:82px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;} .row-fluid:after{clear:both;} .row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;} .row-fluid [class*="span"]:first-child{margin-left:0;} .row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%;} .row-fluid .span12{width:100%;*width:99.94680851063829%;} .row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%;} .row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%;} .row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%;} .row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%;} .row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%;} .row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%;} .row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%;} .row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%;} .row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%;} .row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%;} .row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%;} .row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%;} .row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%;} .row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%;} .row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%;} .row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%;} .row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%;} .row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%;} .row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%;} .row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%;} .row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%;} .row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%;} .row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%;} .row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%;} .row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%;} .row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%;} .row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%;} .row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%;} .row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%;} .row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%;} .row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%;} .row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%;} .row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%;} .row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%;} .row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%;} input,textarea,.uneditable-input{margin-left:0;} .controls-row [class*="span"]+[class*="span"]{margin-left:20px;} input.span12, textarea.span12, .uneditable-input.span12{width:710px;} input.span11, textarea.span11, .uneditable-input.span11{width:648px;} input.span10, textarea.span10, .uneditable-input.span10{width:586px;} input.span9, textarea.span9, .uneditable-input.span9{width:524px;} input.span8, textarea.span8, .uneditable-input.span8{width:462px;} input.span7, textarea.span7, .uneditable-input.span7{width:400px;} input.span6, textarea.span6, .uneditable-input.span6{width:338px;} input.span5, textarea.span5, .uneditable-input.span5{width:276px;} input.span4, textarea.span4, .uneditable-input.span4{width:214px;} input.span3, textarea.span3, .uneditable-input.span3{width:152px;} input.span2, textarea.span2, .uneditable-input.span2{width:90px;} input.span1, textarea.span1, .uneditable-input.span1{width:28px;}}@media (min-width:1200px){.row{margin-left:-30px;*zoom:1;}.row:before,.row:after{display:table;content:"";line-height:0;} .row:after{clear:both;} [class*="span"]{float:left;min-height:1px;margin-left:30px;} .container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px;} .span12{width:1170px;} .span11{width:1070px;} .span10{width:970px;} .span9{width:870px;} .span8{width:770px;} .span7{width:670px;} .span6{width:570px;} .span5{width:470px;} .span4{width:370px;} .span3{width:270px;} .span2{width:170px;} .span1{width:70px;} .offset12{margin-left:1230px;} .offset11{margin-left:1130px;} .offset10{margin-left:1030px;} .offset9{margin-left:930px;} .offset8{margin-left:830px;} .offset7{margin-left:730px;} .offset6{margin-left:630px;} .offset5{margin-left:530px;} .offset4{margin-left:430px;} .offset3{margin-left:330px;} .offset2{margin-left:230px;} .offset1{margin-left:130px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;} .row-fluid:after{clear:both;} .row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;} .row-fluid [class*="span"]:first-child{margin-left:0;} .row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%;} .row-fluid .span12{width:100%;*width:99.94680851063829%;} .row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%;} .row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%;} .row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%;} .row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%;} .row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%;} .row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%;} .row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%;} .row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%;} .row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%;} .row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%;} .row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%;} .row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%;} .row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%;} .row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%;} .row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%;} .row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%;} .row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%;} .row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%;} .row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%;} .row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%;} .row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%;} .row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%;} .row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%;} .row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%;} .row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%;} .row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%;} .row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%;} .row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%;} .row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%;} .row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%;} .row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%;} .row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%;} .row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%;} .row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%;} .row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%;} input,textarea,.uneditable-input{margin-left:0;} .controls-row [class*="span"]+[class*="span"]{margin-left:30px;} input.span12, textarea.span12, .uneditable-input.span12{width:1156px;} input.span11, textarea.span11, .uneditable-input.span11{width:1056px;} input.span10, textarea.span10, .uneditable-input.span10{width:956px;} input.span9, textarea.span9, .uneditable-input.span9{width:856px;} input.span8, textarea.span8, .uneditable-input.span8{width:756px;} input.span7, textarea.span7, .uneditable-input.span7{width:656px;} input.span6, textarea.span6, .uneditable-input.span6{width:556px;} input.span5, textarea.span5, .uneditable-input.span5{width:456px;} input.span4, textarea.span4, .uneditable-input.span4{width:356px;} input.span3, textarea.span3, .uneditable-input.span3{width:256px;} input.span2, textarea.span2, .uneditable-input.span2{width:156px;} input.span1, textarea.span1, .uneditable-input.span1{width:56px;} .thumbnails{margin-left:-30px;} .thumbnails>li{margin-left:30px;} .row-fluid .thumbnails{margin-left:0;}}@media (max-width:979px){body{padding-top:0;} .navbar-fixed-top,.navbar-fixed-bottom{position:static;} .navbar-fixed-top{margin-bottom:20px;} .navbar-fixed-bottom{margin-top:20px;} .navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px;} .navbar .container{width:auto;padding:0;} .navbar .brand{padding-left:10px;padding-right:10px;margin:0 0 0 -5px;} .nav-collapse{clear:both;} .nav-collapse .nav{float:none;margin:0 0 10px;} .nav-collapse .nav>li{float:none;} .nav-collapse .nav>li>a{margin-bottom:2px;} .nav-collapse .nav>.divider-vertical{display:none;} .nav-collapse .nav .nav-header{color:#777777;text-shadow:none;} .nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} .nav-collapse .dropdown-menu li+li a{margin-bottom:2px;} .nav-collapse .nav>li>a:hover,.nav-collapse .dropdown-menu a:hover{background-color:#f2f2f2;} .navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999999;} .navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:hover{background-color:#111111;} .nav-collapse.in .btn-group{margin-top:5px;padding:0;} .nav-collapse .dropdown-menu{position:static;top:auto;left:auto;float:none;display:none;max-width:none;margin:0 15px;padding:0;background-color:transparent;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .nav-collapse .open>.dropdown-menu{display:block;} .nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none;} .nav-collapse .dropdown-menu .divider{display:none;} .nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none;} .nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);} .navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111111;border-bottom-color:#111111;} .navbar .nav-collapse .nav.pull-right{float:none;margin-left:0;} .nav-collapse,.nav-collapse.collapse{overflow:hidden;height:0;} .navbar .btn-navbar{display:block;} .navbar-static .navbar-inner{padding-left:10px;padding-right:10px;}}@media (min-width:980px){.nav-collapse.collapse{height:auto !important;overflow:visible !important;}} 860 | -------------------------------------------------------------------------------- /example/crypto-sha1-2.5.3.js: -------------------------------------------------------------------------------- 1 | ../vendor/crypto-sha1-2.5.3.js -------------------------------------------------------------------------------- /example/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | bigbluebutton-api-js example 9 | 80 | 81 | 82 | 83 | Fork me on GitHub 84 | 85 |
86 |

Server configuration:

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

Some basic parameters:

96 |
97 | 98 | 99 |
100 |
101 | 102 | 103 |
104 |
105 | 106 | 107 |
108 |

Custom Fields

109 |
110 | 111 | 112 |
113 |
114 | 115 | 116 |
117 |
118 | 119 |
120 |
121 |
122 | 123 | 124 | 125 | -------------------------------------------------------------------------------- /example/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0 20px; 3 | } 4 | 5 | .field { 6 | clear: both; 7 | } 8 | 9 | input[type=text] { 10 | width: 100%; 11 | height: 30px; 12 | } 13 | 14 | textarea { 15 | width: 100%; 16 | height: 70px; 17 | } 18 | 19 | #generate { 20 | margin: 20px 0; 21 | } -------------------------------------------------------------------------------- /lib/bigbluebutton-api.js: -------------------------------------------------------------------------------- 1 | // Generated by CoffeeScript 2.4.1 2 | (function() { 3 | var BigBlueButtonApi, filterCustomParameters, include, noChecksumMethods, root, 4 | indexOf = [].indexOf; 5 | 6 | root = typeof exports !== "undefined" && exports !== null ? exports : this; 7 | 8 | BigBlueButtonApi = class BigBlueButtonApi { 9 | // `url`: The complete URL to the server's API, e.g. `http://server.com/bigbluebutton/api` 10 | // `salt`: The shared secret of your server. 11 | // `debug`: Turn on debug messages, printed to `console.log`. 12 | // `opts`: Additional options 13 | constructor(url, salt, debug = false, opts = {}) { 14 | var base; 15 | this.url = url; 16 | this.salt = salt; 17 | this.debug = debug; 18 | this.opts = opts; 19 | if ((base = this.opts).shaType == null) { 20 | base.shaType = 'sha1'; 21 | } 22 | } 23 | 24 | // Returna a list with the name of all available API calls. 25 | availableApiCalls() { 26 | return ['/', 'create', 'join', 'isMeetingRunning', 'getMeetingInfo', 'end', 'getMeetings', 'getDefaultConfigXML', 'setConfigXML', 'enter', 'configXML', 'signOut', 'getRecordings', 'publishRecordings', 'deleteRecordings', 'updateRecordings', 'getRecordingTextTracks']; 27 | } 28 | 29 | // Returns a list of supported parameters in the URL for a given API method. 30 | // The return is an array of arrays composed by: 31 | // [0] - RegEx or string with the parameter name 32 | // [1] - true if the parameter is required, false otherwise 33 | urlParamsFor(param) { 34 | switch (param) { 35 | case "create": 36 | return [["meetingID", true], ["name", true], ["attendeePW", false], ["moderatorPW", false], ["welcome", false], ["dialNumber", false], ["voiceBridge", false], ["webVoice", false], ["logoutURL", false], ["maxParticipants", false], ["record", false], ["duration", false], ["moderatorOnlyMessage", false], ["autoStartRecording", false], ["allowStartStopRecording", false], [/meta_\w+/, false]]; 37 | case "join": 38 | return [["fullName", true], ["meetingID", true], ["password", true], ["createTime", false], ["userID", false], ["webVoiceConf", false], ["configToken", false], ["avatarURL", false], ["redirect", false], ["clientURL", false]]; 39 | case "isMeetingRunning": 40 | return [["meetingID", true]]; 41 | case "end": 42 | return [["meetingID", true], ["password", true]]; 43 | case "getMeetingInfo": 44 | return [["meetingID", true], ["password", true]]; 45 | case "getRecordings": 46 | return [["meetingID", false], ["recordID", false], ["state", false], [/meta_\w+/, false]]; 47 | case "publishRecordings": 48 | return [["recordID", true], ["publish", true]]; 49 | case "deleteRecordings": 50 | return [["recordID", true]]; 51 | case "updateRecordings": 52 | return [["recordID", true], [/meta_\w+/, false]]; 53 | case "getRecordingTextTracks": 54 | return [["recordID", true]]; 55 | } 56 | } 57 | 58 | // Filter `params` to allow only parameters that can be passed 59 | // to the method `method`. 60 | // To use custom parameters, name them `custom_parameterName`. 61 | // The `custom_` prefix will be removed when generating the urls. 62 | filterParams(params, method) { 63 | var filters, r; 64 | filters = this.urlParamsFor(method); 65 | if ((filters == null) || filters.length === 0) { 66 | ({}); 67 | } else { 68 | r = include(params, function(key, value) { 69 | var filter, i, len; 70 | for (i = 0, len = filters.length; i < len; i++) { 71 | filter = filters[i]; 72 | if (filter[0] instanceof RegExp) { 73 | if (key.match(filter[0]) || key.match(/^custom_/)) { 74 | return true; 75 | } 76 | } else { 77 | if (key.match(`^${filter[0]}$`) || key.match(/^custom_/)) { 78 | return true; 79 | } 80 | } 81 | } 82 | return false; 83 | }); 84 | } 85 | return filterCustomParameters(r); 86 | } 87 | 88 | // Returns a url for any `method` available in the BigBlueButton API 89 | // using the parameters in `params`. 90 | // Parameters received: 91 | // * `method`: The name of the API method 92 | // * `params`: An object with pairs of `parameter`:`value`. The parameters will be used only in the 93 | // API calls they should be used. If a parameter name starts with `custom_`, it will 94 | // be used in all API calls, removing the `custom_` prefix. 95 | // Parameters to be used as metadata should use the prefix `meta_`. 96 | // * `filter`: Whether the parameters in `params` should be filtered, so that the API 97 | // calls will contain only the parameters they accept. If false, all parameters 98 | // in `params` will be added to the API call. 99 | urlFor(method, params, filter = true) { 100 | var checksum, i, key, keys, len, param, paramList, property, query, sep, url; 101 | if (this.debug) { 102 | console.log("Generating URL for", method); 103 | } 104 | if (filter) { 105 | params = this.filterParams(params, method); 106 | } else { 107 | params = filterCustomParameters(params); 108 | } 109 | url = this.url; 110 | // mounts the string with the list of parameters 111 | paramList = []; 112 | if (params != null) { 113 | // add the parameters in alphabetical order to prevent checksum errors 114 | keys = []; 115 | for (property in params) { 116 | keys.push(property); 117 | } 118 | keys = keys.sort(); 119 | for (i = 0, len = keys.length; i < len; i++) { 120 | key = keys[i]; 121 | if (key != null) { 122 | param = params[key]; 123 | } 124 | if (param != null) { 125 | paramList.push(`${this.encodeForUrl(key)}=${this.encodeForUrl(param)}`); 126 | } 127 | } 128 | if (paramList.length > 0) { 129 | query = paramList.join("&"); 130 | } 131 | } else { 132 | query = ''; 133 | } 134 | // calculate the checksum 135 | checksum = this.checksum(method, query); 136 | // add the missing elements in the query 137 | if (paramList.length > 0) { 138 | query = `${method}?${query}`; 139 | sep = '&'; 140 | } else { 141 | if (method !== '/') { 142 | query = method; 143 | } 144 | sep = '?'; 145 | } 146 | if (indexOf.call(noChecksumMethods(), method) < 0) { 147 | query = `${query}${sep}checksum=${checksum}`; 148 | } 149 | return `${url}/${query}`; 150 | } 151 | 152 | // Calculates the checksum for an API call `method` with 153 | // the params in `query`. 154 | checksum(method, query) { 155 | var c, shaObj, str; 156 | query || (query = ""); 157 | if (this.debug) { 158 | console.log(`- Calculating the checksum using: '${method}', '${query}', '${this.salt}'`); 159 | } 160 | str = method + query + this.salt; 161 | switch (this.opts.shaType) { 162 | case 'sha1': 163 | shaObj = new jsSHA("SHA-1", "TEXT"); 164 | break; 165 | case 'sha256': 166 | shaObj = new jsSHA("SHA-256", "TEXT"); 167 | break; 168 | case 'sha384': 169 | shaObj = new jsSHA("SHA-384", "TEXT"); 170 | break; 171 | case 'sha512': 172 | shaObj = new jsSHA("SHA-512", "TEXT"); 173 | break; 174 | default: 175 | shaObj = new jsSHA("SHA-1", "TEXT"); 176 | } 177 | shaObj.update(str); 178 | c = shaObj.getHash("HEX"); 179 | if (this.debug) { 180 | console.log("- Checksum calculated:", c); 181 | } 182 | return c; 183 | } 184 | 185 | // Encodes a string to set it in the URL. Has to encode it exactly like BigBlueButton does! 186 | // Otherwise the validation of the checksum might fail at some point. 187 | encodeForUrl(value) { 188 | return encodeURIComponent(value).replace(/%20/g, '+').replace(/[!'()]/g, escape).replace(/\*/g, "%2A"); // use + instead of %20 for space to match what the Java tools do. // encodeURIComponent doesn't escape !'()* but browsers do, so manually escape them. 189 | } 190 | 191 | // Replaces the protocol for `bigbluebutton://`. 192 | setMobileProtocol(url) { 193 | return url.replace(/http[s]?\:\/\//, "bigbluebutton://"); 194 | } 195 | 196 | }; 197 | 198 | // Ruby-like include() method for Objects 199 | include = function(input, _function) { 200 | var _match, _obj, key, value; 201 | _obj = new Object; 202 | _match = null; 203 | for (key in input) { 204 | value = input[key]; 205 | if (_function.call(input, key, value)) { 206 | _obj[key] = value; 207 | } 208 | } 209 | return _obj; 210 | }; 211 | 212 | root.BigBlueButtonApi = BigBlueButtonApi; 213 | 214 | // creates keys without "custom_" and deletes the ones with it 215 | filterCustomParameters = function(params) { 216 | var key, v; 217 | for (key in params) { 218 | v = params[key]; 219 | if (key.match(/^custom_/)) { 220 | params[key.replace(/^custom_/, "")] = v; 221 | } 222 | } 223 | for (key in params) { 224 | if (key.match(/^custom_/)) { 225 | delete params[key]; 226 | } 227 | } 228 | return params; 229 | }; 230 | 231 | noChecksumMethods = function() { 232 | return ['setConfigXML', '/', 'enter', 'configXML', 'signOut']; 233 | }; 234 | 235 | }).call(this); 236 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bigbluebutton-api-js", 3 | "version": "0.0.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "coffeescript": { 8 | "version": "2.4.1", 9 | "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-2.4.1.tgz", 10 | "integrity": "sha512-34GV1aHrsMpTaO3KfMJL40ZNuvKDR/g98THHnE9bQj8HjMaZvSrLik99WWqyMhRtbe8V5hpx5iLgdcSvM/S2wg==" 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "bigbluebutton-api-js", 3 | "version": "0.0.1", 4 | "dependencies": { 5 | "coffeescript": "2.4.1" 6 | }, 7 | "engine": "node >= 12.4.0" 8 | } 9 | -------------------------------------------------------------------------------- /src/bigbluebutton-api.coffee: -------------------------------------------------------------------------------- 1 | root = exports ? this 2 | 3 | class BigBlueButtonApi 4 | 5 | # `url`: The complete URL to the server's API, e.g. `http://server.com/bigbluebutton/api` 6 | # `salt`: The shared secret of your server. 7 | # `debug`: Turn on debug messages, printed to `console.log`. 8 | # `opts`: Additional options 9 | constructor: (url, salt, debug=false, opts={}) -> 10 | @url = url 11 | @salt = salt 12 | @debug = debug 13 | @opts = opts 14 | @opts.shaType ?= 'sha1' 15 | 16 | # Returna a list with the name of all available API calls. 17 | availableApiCalls: -> 18 | [ '/', 19 | 'create', 20 | 'join', 21 | 'isMeetingRunning', 22 | 'getMeetingInfo', 23 | 'end', 24 | 'getMeetings', 25 | 'getDefaultConfigXML', 26 | 'setConfigXML', 27 | 'enter', 28 | 'configXML', 29 | 'signOut', 30 | 'getRecordings', 31 | 'publishRecordings', 32 | 'deleteRecordings', 33 | 'updateRecordings', 34 | 'getRecordingTextTracks' 35 | ] 36 | 37 | # Returns a list of supported parameters in the URL for a given API method. 38 | # The return is an array of arrays composed by: 39 | # [0] - RegEx or string with the parameter name 40 | # [1] - true if the parameter is required, false otherwise 41 | urlParamsFor: (param) -> 42 | switch param 43 | when "create" 44 | [ [ "meetingID", true ] 45 | [ "name", true ], 46 | [ "attendeePW", false ] , 47 | [ "moderatorPW", false ], 48 | [ "welcome", false ], 49 | [ "dialNumber", false ], 50 | [ "voiceBridge", false ], 51 | [ "webVoice", false ], 52 | [ "logoutURL", false ], 53 | [ "maxParticipants", false ], 54 | [ "record", false ], 55 | [ "duration", false ], 56 | [ "moderatorOnlyMessage", false ], 57 | [ "autoStartRecording", false ], 58 | [ "allowStartStopRecording", false ], 59 | [ /meta_\w+/, false ] 60 | ] 61 | when "join" 62 | [ [ "fullName", true ] 63 | [ "meetingID", true ], 64 | [ "password", true ] , 65 | [ "createTime", false ], 66 | [ "userID", false ], 67 | [ "webVoiceConf", false ], 68 | [ "configToken", false ], 69 | [ "avatarURL", false ], 70 | [ "redirect", false ], 71 | [ "clientURL", false ] 72 | ] 73 | when "isMeetingRunning" 74 | [ [ "meetingID", true ] ] 75 | when "end" 76 | [ [ "meetingID", true ], 77 | [ "password", true ] 78 | ] 79 | when "getMeetingInfo" 80 | [ [ "meetingID", true ], 81 | [ "password", true ] 82 | ] 83 | when "getRecordings" 84 | [ [ "meetingID", false ], 85 | [ "recordID", false ], 86 | [ "state", false ], 87 | [ /meta_\w+/, false ] 88 | ] 89 | when "publishRecordings" 90 | [ [ "recordID", true ], 91 | [ "publish", true ] 92 | ] 93 | when "deleteRecordings" 94 | [ [ "recordID", true ] ] 95 | when "updateRecordings" 96 | [ [ "recordID", true ], 97 | [ /meta_\w+/, false ] 98 | ] 99 | when "getRecordingTextTracks" 100 | [ [ "recordID", true ] ] 101 | 102 | # Filter `params` to allow only parameters that can be passed 103 | # to the method `method`. 104 | # To use custom parameters, name them `custom_parameterName`. 105 | # The `custom_` prefix will be removed when generating the urls. 106 | filterParams: (params, method) -> 107 | filters = @urlParamsFor(method) 108 | if not filters? or filters.length is 0 109 | {} 110 | else 111 | r = include params, (key, value) -> 112 | for filter in filters 113 | if filter[0] instanceof RegExp 114 | return true if key.match(filter[0]) or key.match(/^custom_/) 115 | else 116 | return true if key.match("^#{filter[0]}$") or key.match(/^custom_/) 117 | return false 118 | 119 | filterCustomParameters(r) 120 | 121 | # Returns a url for any `method` available in the BigBlueButton API 122 | # using the parameters in `params`. 123 | # Parameters received: 124 | # * `method`: The name of the API method 125 | # * `params`: An object with pairs of `parameter`:`value`. The parameters will be used only in the 126 | # API calls they should be used. If a parameter name starts with `custom_`, it will 127 | # be used in all API calls, removing the `custom_` prefix. 128 | # Parameters to be used as metadata should use the prefix `meta_`. 129 | # * `filter`: Whether the parameters in `params` should be filtered, so that the API 130 | # calls will contain only the parameters they accept. If false, all parameters 131 | # in `params` will be added to the API call. 132 | urlFor: (method, params, filter=true) -> 133 | console.log "Generating URL for", method if @debug 134 | if filter 135 | params = @filterParams(params, method) 136 | else 137 | params = filterCustomParameters(params) 138 | 139 | url = @url 140 | 141 | # mounts the string with the list of parameters 142 | paramList = [] 143 | if params? 144 | # add the parameters in alphabetical order to prevent checksum errors 145 | keys = [] 146 | keys.push(property) for property of params 147 | keys = keys.sort() 148 | for key in keys 149 | param = params[key] if key? 150 | paramList.push "#{@encodeForUrl(key)}=#{@encodeForUrl(param)}" if param? 151 | query = paramList.join("&") if paramList.length > 0 152 | else 153 | query = '' 154 | 155 | # calculate the checksum 156 | checksum = @checksum(method, query) 157 | 158 | # add the missing elements in the query 159 | if paramList.length > 0 160 | query = "#{method}?#{query}" 161 | sep = '&' 162 | else 163 | query = method unless method is '/' 164 | sep = '?' 165 | unless method in noChecksumMethods() 166 | query = "#{query}#{sep}checksum=#{checksum}" 167 | 168 | "#{url}/#{query}" 169 | 170 | # Calculates the checksum for an API call `method` with 171 | # the params in `query`. 172 | checksum: (method, query) -> 173 | query ||= "" 174 | console.log "- Calculating the checksum using: '#{method}', '#{query}', '#{@salt}'" if @debug 175 | str = method + query + @salt 176 | switch @opts.shaType 177 | when 'sha1' then shaObj = new jsSHA("SHA-1", "TEXT") 178 | when 'sha256' then shaObj = new jsSHA("SHA-256", "TEXT") 179 | when 'sha384' then shaObj = new jsSHA("SHA-384", "TEXT") 180 | when 'sha512' then shaObj = new jsSHA("SHA-512", "TEXT") 181 | else shaObj = new jsSHA("SHA-1", "TEXT") 182 | 183 | shaObj.update(str) 184 | c = shaObj.getHash("HEX") 185 | console.log "- Checksum calculated:", c if @debug 186 | c 187 | 188 | # Encodes a string to set it in the URL. Has to encode it exactly like BigBlueButton does! 189 | # Otherwise the validation of the checksum might fail at some point. 190 | encodeForUrl: (value) -> 191 | encodeURIComponent(value) 192 | .replace(/%20/g, '+') # use + instead of %20 for space to match what the Java tools do. 193 | .replace(/[!'()]/g, escape) # encodeURIComponent doesn't escape !'()* but browsers do, so manually escape them. 194 | .replace(/\*/g, "%2A") 195 | 196 | # Replaces the protocol for `bigbluebutton://`. 197 | setMobileProtocol: (url) -> 198 | url.replace(/http[s]?\:\/\//, "bigbluebutton://") 199 | 200 | # Ruby-like include() method for Objects 201 | include = (input, _function) -> 202 | _obj = new Object 203 | _match = null 204 | for key, value of input 205 | if _function.call(input, key, value) 206 | _obj[key] = value 207 | _obj 208 | 209 | root.BigBlueButtonApi = BigBlueButtonApi 210 | 211 | # creates keys without "custom_" and deletes the ones with it 212 | filterCustomParameters = (params) -> 213 | for key, v of params 214 | if key.match(/^custom_/) 215 | params[key.replace(/^custom_/, "")] = v 216 | for key of params 217 | delete params[key] if key.match(/^custom_/) 218 | params 219 | 220 | noChecksumMethods = -> 221 | ['setConfigXML', '/', 'enter', 'configXML', 'signOut'] 222 | -------------------------------------------------------------------------------- /vendor/jsSHA.js: -------------------------------------------------------------------------------- 1 | /* 2 | A JavaScript implementation of the SHA family of hashes, as 3 | defined in FIPS PUB 180-4 and FIPS PUB 202, as well as the corresponding 4 | HMAC implementation as defined in FIPS PUB 198a 5 | 6 | Copyright Brian Turek 2008-2017 7 | Distributed under the BSD License 8 | See http://caligatio.github.com/jsSHA/ for more information 9 | 10 | Several functions taken from Paul Johnston 11 | */ 12 | 'use strict';(function(Y){function C(c,a,b){var e=0,h=[],n=0,g,l,d,f,m,q,u,r,I=!1,v=[],w=[],t,y=!1,z=!1,x=-1;b=b||{};g=b.encoding||"UTF8";t=b.numRounds||1;if(t!==parseInt(t,10)||1>t)throw Error("numRounds must a integer >= 1");if("SHA-1"===c)m=512,q=K,u=Z,f=160,r=function(a){return a.slice()};else if(0===c.lastIndexOf("SHA-",0))if(q=function(a,b){return L(a,b,c)},u=function(a,b,h,e){var k,f;if("SHA-224"===c||"SHA-256"===c)k=(b+65>>>9<<4)+15,f=16;else if("SHA-384"===c||"SHA-512"===c)k=(b+129>>>10<< 13 | 5)+31,f=32;else throw Error("Unexpected error in SHA-2 implementation");for(;a.length<=k;)a.push(0);a[b>>>5]|=128<<24-b%32;b=b+h;a[k]=b&4294967295;a[k-1]=b/4294967296|0;h=a.length;for(b=0;be;e+=1)c[e]=a[e].slice();return c};x=1;if("SHA3-224"=== 15 | c)m=1152,f=224;else if("SHA3-256"===c)m=1088,f=256;else if("SHA3-384"===c)m=832,f=384;else if("SHA3-512"===c)m=576,f=512;else if("SHAKE128"===c)m=1344,f=-1,F=31,z=!0;else if("SHAKE256"===c)m=1088,f=-1,F=31,z=!0;else throw Error("Chosen SHA variant is not supported");u=function(a,c,e,b,h){e=m;var k=F,f,g=[],n=e>>>5,l=0,d=c>>>5;for(f=0;f=e;f+=n)b=D(a.slice(f,f+n),b),c-=e;a=a.slice(f);for(c%=e;a.length>>3;a[f>>2]^=k<=h)break;g.push(a.a);l+=1;0===64*l%e&&D(null,b)}return g}}else throw Error("Chosen SHA variant is not supported");d=M(a,g,x);l=A(c);this.setHMACKey=function(a,b,h){var k;if(!0===I)throw Error("HMAC key already set");if(!0===y)throw Error("Cannot set HMAC key after calling update");if(!0===z)throw Error("SHAKE is not supported for HMAC");g=(h||{}).encoding||"UTF8";b=M(b,g,x)(a);a=b.binLen;b=b.value;k=m>>>3;h=k/4-1;if(ka/8){for(;b.length<=h;)b.push(0);b[h]&=4294967040}for(a=0;a<=h;a+=1)v[a]=b[a]^909522486,w[a]=b[a]^1549556828;l=q(v,l);e=m;I=!0};this.update=function(a){var c,b,k,f=0,g=m>>>5;c=d(a,h,n);a=c.binLen;b=c.value;c=a>>>5;for(k=0;k>>5);n=a%m;y=!0};this.getHash=function(a,b){var k,g,d,m;if(!0===I)throw Error("Cannot call getHash after setting HMAC key");d=N(b);if(!0===z){if(-1===d.shakeLen)throw Error("shakeLen must be specified in options"); 18 | f=d.shakeLen}switch(a){case "HEX":k=function(a){return O(a,f,x,d)};break;case "B64":k=function(a){return P(a,f,x,d)};break;case "BYTES":k=function(a){return Q(a,f,x)};break;case "ARRAYBUFFER":try{g=new ArrayBuffer(0)}catch(p){throw Error("ARRAYBUFFER not supported by this environment");}k=function(a){return R(a,f,x)};break;default:throw Error("format must be HEX, B64, BYTES, or ARRAYBUFFER");}m=u(h.slice(),n,e,r(l),f);for(g=1;g>>24-f%32),m=u(m,f, 19 | 0,A(c),f);return k(m)};this.getHMAC=function(a,b){var k,g,d,p;if(!1===I)throw Error("Cannot call getHMAC without first setting HMAC key");d=N(b);switch(a){case "HEX":k=function(a){return O(a,f,x,d)};break;case "B64":k=function(a){return P(a,f,x,d)};break;case "BYTES":k=function(a){return Q(a,f,x)};break;case "ARRAYBUFFER":try{k=new ArrayBuffer(0)}catch(v){throw Error("ARRAYBUFFER not supported by this environment");}k=function(a){return R(a,f,x)};break;default:throw Error("outputFormat must be HEX, B64, BYTES, or ARRAYBUFFER"); 20 | }g=u(h.slice(),n,e,r(l),f);p=q(w,A(c));p=u(g,f,m,p,f);return k(p)}}function b(c,a){this.a=c;this.b=a}function O(c,a,b,e){var h="";a/=8;var n,g,d;d=-1===b?3:0;for(n=0;n>>2]>>>8*(d+n%4*b),h+="0123456789abcdef".charAt(g>>>4&15)+"0123456789abcdef".charAt(g&15);return e.outputUpper?h.toUpperCase():h}function P(c,a,b,e){var h="",n=a/8,g,d,p,f;f=-1===b?3:0;for(g=0;g>>2]:0,p=g+2>>2]:0,p=(c[g>>>2]>>>8*(f+g%4*b)&255)<<16|(d>>>8*(f+(g+1)%4*b)&255)<<8|p>>>8*(f+ 21 | (g+2)%4*b)&255,d=0;4>d;d+=1)8*g+6*d<=a?h+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(p>>>6*(3-d)&63):h+=e.b64Pad;return h}function Q(c,a,b){var e="";a/=8;var h,d,g;g=-1===b?3:0;for(h=0;h>>2]>>>8*(g+h%4*b)&255,e+=String.fromCharCode(d);return e}function R(c,a,b){a/=8;var e,h=new ArrayBuffer(a),d,g;g=new Uint8Array(h);d=-1===b?3:0;for(e=0;e>>2]>>>8*(d+e%4*b)&255;return h}function N(c){var a={outputUpper:!1,b64Pad:"=",shakeLen:-1};c=c||{}; 22 | a.outputUpper=c.outputUpper||!1;!0===c.hasOwnProperty("b64Pad")&&(a.b64Pad=c.b64Pad);if(!0===c.hasOwnProperty("shakeLen")){if(0!==c.shakeLen%8)throw Error("shakeLen must be a multiple of 8");a.shakeLen=c.shakeLen}if("boolean"!==typeof a.outputUpper)throw Error("Invalid outputUpper formatting option");if("string"!==typeof a.b64Pad)throw Error("Invalid b64Pad formatting option");return a}function M(c,a,b){switch(a){case "UTF8":case "UTF16BE":case "UTF16LE":break;default:throw Error("encoding must be UTF8, UTF16BE, or UTF16LE"); 23 | }switch(c){case "HEX":c=function(a,c,d){var g=a.length,l,p,f,m,q,u;if(0!==g%2)throw Error("String of HEX type must be in byte increments");c=c||[0];d=d||0;q=d>>>3;u=-1===b?3:0;for(l=0;l>>1)+q;for(f=m>>>2;c.length<=f;)c.push(0);c[f]|=p<<8*(u+m%4*b)}return{value:c,binLen:4*g+d}};break;case "TEXT":c=function(c,h,d){var g,l,p=0,f,m,q,u,r,t;h=h||[0];d=d||0;q=d>>>3;if("UTF8"===a)for(t=-1=== 24 | b?3:0,f=0;fg?l.push(g):2048>g?(l.push(192|g>>>6),l.push(128|g&63)):55296>g||57344<=g?l.push(224|g>>>12,128|g>>>6&63,128|g&63):(f+=1,g=65536+((g&1023)<<10|c.charCodeAt(f)&1023),l.push(240|g>>>18,128|g>>>12&63,128|g>>>6&63,128|g&63)),m=0;m>>2;h.length<=u;)h.push(0);h[u]|=l[m]<<8*(t+r%4*b);p+=1}else if("UTF16BE"===a||"UTF16LE"===a)for(t=-1===b?2:0,l="UTF16LE"===a&&1!==b||"UTF16LE"!==a&&1===b,f=0;f>>8);r=p+q;for(u=r>>>2;h.length<=u;)h.push(0);h[u]|=g<<8*(t+r%4*b);p+=2}return{value:h,binLen:8*p+d}};break;case "B64":c=function(a,c,d){var g=0,l,p,f,m,q,u,r,t;if(-1===a.search(/^[a-zA-Z0-9=+\/]+$/))throw Error("Invalid character in base-64 string");p=a.indexOf("=");a=a.replace(/\=/g,"");if(-1!==p&&p