├── index.ts ├── index.d.ts ├── src ├── style │ ├── index.js │ └── busy.less ├── index.ts ├── busy.service.ts ├── busy-backdrop.component.ts ├── busy.module.ts ├── busy-config.ts ├── util.ts ├── busy.component.ts ├── promise-tracker.service.ts └── busy.directive.ts ├── demo ├── style │ └── variable.less ├── asset │ ├── img │ │ └── du.gif │ ├── index.html │ ├── css │ │ ├── busy.css │ │ └── bootstrap.min.css │ └── js │ │ └── main.js ├── app │ ├── index.ts │ ├── header │ │ ├── index.ts │ │ ├── header.component.html │ │ ├── header.component.ts │ │ └── header.component.less │ ├── table │ │ ├── index.ts │ │ ├── table.component.less │ │ ├── table.component.ts │ │ └── table.component.html │ ├── options │ │ ├── index.ts │ │ ├── options.component.less │ │ ├── options-template.ts │ │ ├── options.component.ts │ │ └── options.component.html │ ├── github-corner │ │ ├── index.ts │ │ ├── github-corner.component.ts │ │ ├── github-corner.component.html │ │ └── github-corner.component.less │ ├── app.component.html │ ├── app.component.ts │ ├── app.component.less │ └── app.module.ts ├── main.ts ├── vendor.ts ├── index.html └── tsconfig.json ├── index.js.map ├── .travis.yml ├── index.metadata.json ├── test ├── busy.spec.ts ├── index.html └── busy.spec.js ├── .npmignore ├── .gitignore ├── index.js ├── config ├── helper.js ├── webpack.test.js ├── webpack.busy.js └── webpack.demo.js ├── webpack.config.js ├── tsconfig.json ├── LICENSE ├── package.json ├── tslint.json └── README.md /index.ts: -------------------------------------------------------------------------------- 1 | export * from './build/index'; 2 | -------------------------------------------------------------------------------- /index.d.ts: -------------------------------------------------------------------------------- 1 | export * from './build/index'; 2 | -------------------------------------------------------------------------------- /src/style/index.js: -------------------------------------------------------------------------------- 1 | require('./busy.less'); 2 | -------------------------------------------------------------------------------- /demo/style/variable.less: -------------------------------------------------------------------------------- 1 | @theme-color: #b03a58; 2 | @theme-color-light: #e86c8c; 3 | -------------------------------------------------------------------------------- /demo/asset/img/du.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devyumao/angular2-busy/HEAD/demo/asset/img/du.gif -------------------------------------------------------------------------------- /index.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["../index.ts"],"names":[],"mappings":";;;;;AAAA,mCAA8B","file":"index.js","sourceRoot":""} -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | branches: 2 | only: 3 | - master 4 | language: node_js 5 | node_js: 6 | - "node" 7 | script: 8 | - npm run build 9 | -------------------------------------------------------------------------------- /demo/app/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @file App index 3 | * @author yumao 4 | */ 5 | 6 | export * from './app.component'; 7 | -------------------------------------------------------------------------------- /demo/app/header/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @file Header index 3 | * @author yumao 4 | */ 5 | 6 | export * from './header.component'; 7 | -------------------------------------------------------------------------------- /demo/app/table/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @file Table index 3 | * @author yumao 4 | */ 5 | 6 | export * from './table.component'; 7 | -------------------------------------------------------------------------------- /demo/app/options/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @file Options index 3 | * @author yumao 4 | */ 5 | 6 | export * from './options.component'; 7 | -------------------------------------------------------------------------------- /demo/app/github-corner/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @file GithubCorner index 3 | * @author yumao 4 | */ 5 | 6 | export * from './github-corner.component'; 7 | -------------------------------------------------------------------------------- /demo/app/table/table.component.less: -------------------------------------------------------------------------------- 1 | /** 2 | * @file Table style 3 | * @author yumao 4 | */ 5 | 6 | .table { 7 | position: relative; 8 | } 9 | -------------------------------------------------------------------------------- /index.metadata.json: -------------------------------------------------------------------------------- 1 | [{"__symbolic":"module","version":3,"metadata":{},"exports":[{"from":"./build/index"}]},{"__symbolic":"module","version":1,"metadata":{},"exports":[{"from":"./build/index"}]}] -------------------------------------------------------------------------------- /test/busy.spec.ts: -------------------------------------------------------------------------------- 1 | import { 2 | inject, 3 | } from '@angular/core/testing'; 4 | 5 | import {BusyDirective} from '..'; 6 | 7 | describe('BusyDirective', () => { 8 | // forthcoming... 9 | }); 10 | -------------------------------------------------------------------------------- /demo/app/options/options.component.less: -------------------------------------------------------------------------------- 1 | /** 2 | * @file Options style 3 | * @author yumao 4 | */ 5 | 6 | @import "~style/variable.less"; 7 | 8 | .c-checkbox { 9 | line-height: 36px; 10 | } 11 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | 3 | /build/busy.js 4 | /config 5 | /demo 6 | /test 7 | /typings 8 | /tsconfig.json 9 | /tslint.json 10 | /typings.json 11 | /webpack.config.js 12 | 13 | .gitignore 14 | 15 | *.ngsummary.json 16 | *.ngfactory.ts 17 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @file Busy index 3 | * @author yumao 4 | */ 5 | 6 | export * from './busy.module'; 7 | export * from './busy.directive'; 8 | export * from './busy.service'; 9 | export * from './busy-config'; 10 | -------------------------------------------------------------------------------- /demo/app/header/header.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |

Angular 2 Busy

4 |

Show busy/loading indicators on any promise, or on any Observable's subscription.

5 |
6 |
7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Node Files 2 | /node_modules 3 | npm-debug.log 4 | 5 | # OS generated files 6 | .DS_Store 7 | ehthumbs.db 8 | Icon? 9 | Thumbs.db 10 | 11 | # Style scripts 12 | build/busy.js 13 | 14 | # AOT files 15 | *.ngsummary.json 16 | *.ngfactory.ts 17 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | function __export(m) { 3 | for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; 4 | } 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | __export(require("./build/index")); 7 | //# sourceMappingURL=index.js.map -------------------------------------------------------------------------------- /config/helper.js: -------------------------------------------------------------------------------- 1 | var path = require('path'); 2 | 3 | var _root = path.resolve(__dirname, '..'); 4 | 5 | function root(args) { 6 | args = Array.prototype.slice.call(arguments, 0); 7 | return path.join.apply(path, [_root].concat(args)); 8 | } 9 | 10 | module.exports = { 11 | root: root 12 | }; 13 | -------------------------------------------------------------------------------- /demo/main.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @file main 3 | * @author yumao 4 | */ 5 | 6 | import {platformBrowserDynamic} from '@angular/platform-browser-dynamic'; 7 | import {enableProdMode} from '@angular/core'; 8 | 9 | import {AppModule} from './app/app.module'; 10 | 11 | enableProdMode(); 12 | 13 | platformBrowserDynamic().bootstrapModule(AppModule); 14 | -------------------------------------------------------------------------------- /demo/app/header/header.component.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @file Component: Header 3 | * @author yumao 4 | */ 5 | 6 | import {Component} from '@angular/core'; 7 | 8 | @Component({ 9 | selector: 'demo-header', 10 | template: require('./header.component.html'), 11 | styles: [require('./header.component.less')] 12 | }) 13 | export class HeaderComponent { 14 | } 15 | -------------------------------------------------------------------------------- /demo/app/header/header.component.less: -------------------------------------------------------------------------------- 1 | /** 2 | * @file Header style 3 | * @author yumao 4 | */ 5 | 6 | @import "~style/variable.less"; 7 | 8 | header { 9 | padding: 3rem .9375rem; 10 | margin-bottom: 3rem; 11 | background: @theme-color; 12 | color: lighten(@theme-color, 36%); 13 | 14 | h1 { 15 | color: #fff; 16 | font-size: 3rem; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /demo/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 |
6 |
7 | 8 |
9 |
10 | 11 |
12 |
13 |
14 | -------------------------------------------------------------------------------- /demo/app/github-corner/github-corner.component.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @file Component: GithubCorner 3 | * @author yumao 4 | */ 5 | 6 | import {Component} from '@angular/core'; 7 | 8 | @Component({ 9 | selector: 'github-corner', 10 | template: require('./github-corner.component.html'), 11 | styles: [require('./github-corner.component.less')] 12 | }) 13 | export class GithubCornerComponent { 14 | } 15 | -------------------------------------------------------------------------------- /src/busy.service.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @file Service: Busy 3 | * @author yumao 4 | */ 5 | 6 | import {Injectable, Optional} from '@angular/core'; 7 | 8 | import {BusyConfig} from './busy-config'; 9 | 10 | @Injectable() 11 | export class BusyService { 12 | config: BusyConfig; 13 | 14 | constructor(@Optional() config: BusyConfig) { 15 | this.config = config || new BusyConfig(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /demo/app/app.component.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @file Component: App 3 | * @author yumao 4 | */ 5 | 6 | import {Component, ViewEncapsulation} from '@angular/core'; 7 | import {Http} from '@angular/http'; 8 | 9 | @Component({ 10 | selector: 'app', 11 | encapsulation: ViewEncapsulation.None, 12 | template: require('./app.component.html'), 13 | styles: [require('./app.component.less')] 14 | }) 15 | export class AppComponent { 16 | } 17 | -------------------------------------------------------------------------------- /demo/vendor.ts: -------------------------------------------------------------------------------- 1 | // Polyfills 2 | import 'core-js/es6'; 3 | import 'core-js/es7/reflect'; 4 | require('zone.js/dist/zone'); 5 | 6 | // Angular 2 7 | import '@angular/platform-browser'; 8 | import '@angular/platform-browser/animations'; 9 | import '@angular/platform-browser-dynamic'; 10 | import '@angular/core'; 11 | import '@angular/forms'; 12 | import '@angular/http'; 13 | 14 | // RxJS 15 | import 'rxjs/add/operator/toPromise'; 16 | 17 | // Busy 18 | import '..'; 19 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @file Webpack config 3 | * @author yumao 4 | */ 5 | 6 | // Look in ./config folder for webpack.[type].js 7 | switch (process.env.NODE_ENV) { 8 | case 'demo': 9 | module.exports = require('./config/webpack.demo'); 10 | break; 11 | case 'test': 12 | module.exports = require('./config/webpack.test'); 13 | break; 14 | case 'busy': 15 | default: 16 | module.exports = require('./config/webpack.busy'); 17 | } 18 | -------------------------------------------------------------------------------- /demo/app/table/table.component.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @file Component: Table 3 | * @author yumao 4 | */ 5 | 6 | import {Component, Input} from '@angular/core'; 7 | 8 | import {IBusyConfig} from '../../..'; 9 | // import {IBusyConfig} from 'angular2-busy'; 10 | 11 | @Component({ 12 | selector: 'demo-table', 13 | template: require('./table.component.html'), 14 | styles: [require('./table.component.less')] 15 | }) 16 | export class TableComponent { 17 | @Input() loading: IBusyConfig; 18 | } 19 | -------------------------------------------------------------------------------- /demo/app/options/options-template.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @file Options Template 3 | * @author yumao 4 | */ 5 | 6 | import {BUSY_CONFIG_DEFAULTS} from '../../..'; 7 | 8 | export const OPTIONS_TEMPLATE: Object = { 9 | default: BUSY_CONFIG_DEFAULTS.template, 10 | custom: ` 11 |
12 |
13 | {{message}} 14 |
15 |
16 | ` 17 | }; 18 | -------------------------------------------------------------------------------- /test/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Angular 2 Tests 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "module": "commonjs", 5 | "emitDecoratorMetadata": true, 6 | "experimentalDecorators": true, 7 | "sourceMap": true, 8 | "declaration": false, 9 | "outDir": "build", 10 | "lib": ["es2015", "dom"], 11 | "moduleResolution": "node" 12 | }, 13 | "files": [ 14 | "./src/index.ts" 15 | ], 16 | "awesomeTypescriptLoaderOptions": { 17 | "resolveGlobs": true, 18 | "forkChecker": true 19 | }, 20 | "angularCompilerOptions": { 21 | "strictMetadataEmit": true 22 | }, 23 | "compileOnSave": false, 24 | "buildOnSave": false, 25 | "atom": { 26 | "rewriteTsconfig": false 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /demo/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Angular 2 Busy Demo 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
Loading...
16 |
17 | 18 | 19 | -------------------------------------------------------------------------------- /config/webpack.test.js: -------------------------------------------------------------------------------- 1 | var ForkCheckerPlugin = require('awesome-typescript-loader').ForkCheckerPlugin; 2 | 3 | var helper = require('./helper'); 4 | 5 | module.exports = { 6 | debug: true, 7 | 8 | context: helper.root('test'), 9 | 10 | entry: { 11 | 'busy.spec': 'busy.spec.ts' 12 | }, 13 | 14 | output: { 15 | path: helper.root('test'), 16 | filename: '[name].js' 17 | }, 18 | 19 | resolve: { 20 | extensions: ['', '.ts', '.js'], 21 | root: helper.root('test'), 22 | modulesDirectories: ['node_modules'] 23 | }, 24 | 25 | module: { 26 | loaders: [ 27 | { 28 | test: /\.ts$/, 29 | loader: 'awesome-typescript' 30 | } 31 | ] 32 | }, 33 | 34 | plugins: [ 35 | new ForkCheckerPlugin() 36 | ] 37 | }; 38 | -------------------------------------------------------------------------------- /demo/app/table/table.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 |
#NameSpeciesOccupation
1Arthur DentHumanRadio Employee
2Ford PrefectBetelgeusianResearcher
3MarvinRobotServant
31 | -------------------------------------------------------------------------------- /demo/app/app.component.less: -------------------------------------------------------------------------------- 1 | /** 2 | * @file App style 3 | * @author yumao 4 | */ 5 | 6 | @import "~style/variable.less"; 7 | 8 | .form-control { 9 | &:focus { 10 | border-color: @theme-color-light; 11 | } 12 | } 13 | 14 | .c-input { 15 | > input { 16 | &:checked { 17 | ~ .c-indicator { 18 | background-color: @theme-color; 19 | } 20 | } 21 | 22 | &:focus { 23 | ~ .c-indicator { 24 | box-shadow: 0 0 0 .075rem #fff, 0 0 0 .2rem @theme-color; 25 | } 26 | } 27 | 28 | &:active { 29 | ~ .c-indicator { 30 | background-color: @theme-color-light; 31 | } 32 | } 33 | } 34 | } 35 | 36 | .btn { 37 | &:focus { 38 | &, 39 | &:active { 40 | outline: 0; 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /demo/asset/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Angular 2 Busy Demo 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
Loading...
16 |
17 | 18 | 19 | -------------------------------------------------------------------------------- /demo/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "module": "commonjs", 5 | "emitDecoratorMetadata": true, 6 | "experimentalDecorators": true, 7 | "sourceMap": true, 8 | "declaration": false, 9 | "outDir": "build", 10 | "lib": ["es2015", "dom"] 11 | }, 12 | "exclude": [ 13 | "node_modules", 14 | "build", 15 | "demo", 16 | "test" 17 | ], 18 | "filesGlob": [ 19 | "./index.ts", 20 | "./src/**/*.ts", 21 | "./demo/**/*.ts", 22 | "!./node_modules/**/*.ts", 23 | "typings/browser.d.ts" 24 | ], 25 | "awesomeTypescriptLoaderOptions": { 26 | "resolveGlobs": true, 27 | "forkChecker": true 28 | }, 29 | "angularCompilerOptions": { 30 | "strictMetadataEmit": true 31 | }, 32 | "compileOnSave": false, 33 | "buildOnSave": false, 34 | "atom": { 35 | "rewriteTsconfig": false 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /config/webpack.busy.js: -------------------------------------------------------------------------------- 1 | var ExtractTextPlugin = require('extract-text-webpack-plugin'); 2 | var autoprefixer = require('autoprefixer'); 3 | 4 | var helper = require('./helper'); 5 | 6 | module.exports = { 7 | debug: false, 8 | 9 | context: helper.root('src'), 10 | 11 | entry: { 12 | 'busy': 'style' 13 | }, 14 | 15 | output: { 16 | path: helper.root('build'), 17 | filename: '[name].js' 18 | }, 19 | 20 | resolve: { 21 | extensions: ['', '.js'], 22 | root: helper.root('src') 23 | }, 24 | 25 | module: { 26 | loaders: [ 27 | { 28 | test: /\.css$/, 29 | loader: 'raw' 30 | }, 31 | { 32 | test: /\.less$/, 33 | loader: ExtractTextPlugin.extract('raw!postcss!less') 34 | } 35 | ] 36 | }, 37 | 38 | postcss: [ 39 | autoprefixer() 40 | ], 41 | 42 | plugins: [ 43 | new ExtractTextPlugin('style/[name].css') 44 | ] 45 | }; 46 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Yumao 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /demo/app/github-corner/github-corner.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /demo/app/options/options.component.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @file Component: Options 3 | * @author yumao 4 | */ 5 | 6 | import {Component, Input} from '@angular/core'; 7 | import {Http} from '@angular/http'; 8 | 9 | import {BUSY_CONFIG_DEFAULTS, IBusyConfig} from '../../..'; 10 | // import {BUSY_CONFIG_DEFAULTS, IBusyConfig} from 'angular2-busy'; 11 | import {OPTIONS_TEMPLATE} from './options-template'; 12 | 13 | @Component({ 14 | selector: 'demo-options', 15 | template: require('./options.component.html'), 16 | styles: [require('./options.component.less')] 17 | }) 18 | export class OptionsComponent { 19 | templateType: string = 'default'; 20 | data: IBusyConfig = Object.assign({}, BUSY_CONFIG_DEFAULTS); 21 | 22 | constructor(private http: Http) { 23 | } 24 | 25 | changeTemplate(type: string) { 26 | this.data.template = OPTIONS_TEMPLATE[type]; 27 | } 28 | 29 | playDemo() { 30 | // this.data.busy = this.http.get('https://httpbin.org/delay/3') 31 | // .subscribe(); 32 | 33 | this.data.busy = this.http.get('https://httpbin.org/delay/1') 34 | .toPromise(); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/busy-backdrop.component.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @file Component: BusyBackdrop 3 | * @author yumao 4 | */ 5 | 6 | import {Component} from '@angular/core'; 7 | import {trigger, state, style, transition, animate} from '@angular/animations'; 8 | 9 | import {PromiseTrackerService} from './promise-tracker.service'; 10 | 11 | const inactiveStyle = style({ 12 | opacity: 0, 13 | }); 14 | const timing = '.3s ease'; 15 | 16 | @Component({ 17 | selector: 'ng-busy-backdrop', 18 | template: ` 19 |
22 |
23 | `, 24 | animations: [ 25 | trigger('fadeInOut', [ 26 | transition('void => *', [ 27 | inactiveStyle, 28 | animate(timing) 29 | ]), 30 | transition('* => void', [ 31 | animate(timing, inactiveStyle) 32 | ]) 33 | ]) 34 | ] 35 | }) 36 | export class BusyBackdropComponent { 37 | constructor(private tracker: PromiseTrackerService) { 38 | } 39 | 40 | isActive() { 41 | return this.tracker.isActive(); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /demo/app/github-corner/github-corner.component.less: -------------------------------------------------------------------------------- 1 | /** 2 | * @file GithubCorner style 3 | * @author yumao 4 | */ 5 | 6 | @import "~style/variable.less"; 7 | 8 | @octo-arm-animation: octocat-wave 560ms ease-in-out; 9 | 10 | .github-corner { 11 | svg { 12 | position: absolute; 13 | top: 0; 14 | border: 0; 15 | right: 0; 16 | fill: #fff; 17 | color: @theme-color; 18 | } 19 | 20 | .octo-arm { 21 | transform-origin: 130px 106px; 22 | } 23 | 24 | &:hover { 25 | .octo-arm { 26 | animation: @octo-arm-animation; 27 | } 28 | } 29 | } 30 | 31 | @media(max-width: 500px) { 32 | .github-corner { 33 | .octo-arm { 34 | animation: @octo-arm-animation; 35 | } 36 | 37 | &:hover { 38 | .octo-arm { 39 | animation: none; 40 | } 41 | } 42 | } 43 | } 44 | 45 | @keyframes octocat-wave { 46 | 0%, 100% { 47 | transform: rotate(0); 48 | } 49 | 20%, 60% { 50 | transform: rotate(-25deg); 51 | } 52 | 40%, 80% { 53 | transform: rotate(10deg); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /demo/app/app.module.ts: -------------------------------------------------------------------------------- 1 | import {NgModule} from '@angular/core'; 2 | import {BrowserModule} from '@angular/platform-browser'; 3 | import {HttpModule} from '@angular/http'; 4 | import {FormsModule} from '@angular/forms'; 5 | import {BrowserAnimationsModule} from '@angular/platform-browser/animations'; 6 | 7 | import {BusyModule, BusyConfig} from '../..'; 8 | // import {BusyModule, BusyConfig} from 'angular2-busy'; 9 | import {AppComponent} from './app.component'; 10 | import {GithubCornerComponent} from './github-corner'; 11 | import {HeaderComponent} from './header'; 12 | import {OptionsComponent} from './options'; 13 | import {TableComponent} from './table'; 14 | 15 | @NgModule({ 16 | imports: [ 17 | BrowserModule, 18 | FormsModule, 19 | HttpModule, 20 | BusyModule, 21 | BrowserAnimationsModule 22 | // BusyModule.forRoot(new BusyConfig({ 23 | // message: 'test', 24 | // backdrop: false 25 | // })) 26 | ], 27 | declarations: [ 28 | AppComponent, 29 | GithubCornerComponent, 30 | HeaderComponent, 31 | OptionsComponent, 32 | TableComponent 33 | ], 34 | bootstrap: [AppComponent] 35 | }) 36 | export class AppModule {} 37 | -------------------------------------------------------------------------------- /src/busy.module.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @file Module: Busy 3 | * @author yumao 4 | */ 5 | 6 | import {NgModule, Compiler} from '@angular/core'; 7 | import {CommonModule} from '@angular/common'; 8 | import {ModuleWithProviders} from '@angular/core'; 9 | import {JitCompilerFactory} from '@angular/compiler'; 10 | 11 | import {BusyDirective} from './busy.directive'; 12 | import {BusyService} from './busy.service'; 13 | import {BusyBackdropComponent} from './busy-backdrop.component'; 14 | import {BusyComponent} from './busy.component'; 15 | import {BusyConfig} from './busy-config'; 16 | 17 | // Workaround for Compiler in AOT 18 | // https://github.com/angular/angular/issues/15510#issuecomment-294301758 19 | export function createJitCompiler() { 20 | return new JitCompilerFactory([{useDebug: false, useJit: true}]).createCompiler(); 21 | } 22 | 23 | @NgModule({ 24 | imports: [ 25 | CommonModule 26 | ], 27 | declarations: [ 28 | BusyDirective, 29 | BusyComponent, 30 | BusyBackdropComponent, 31 | ], 32 | providers: [ 33 | BusyService, 34 | {provide: Compiler, useFactory: createJitCompiler}, 35 | ], 36 | exports: [BusyDirective], 37 | entryComponents: [ 38 | BusyComponent, 39 | BusyBackdropComponent 40 | ] 41 | }) 42 | export class BusyModule { 43 | static forRoot(config: BusyConfig): ModuleWithProviders { 44 | return { 45 | ngModule: BusyModule, 46 | providers: [ 47 | {provide: BusyConfig, useValue: config} 48 | ] 49 | }; 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /test/busy.spec.js: -------------------------------------------------------------------------------- 1 | /******/ (function(modules) { // webpackBootstrap 2 | /******/ // The module cache 3 | /******/ var installedModules = {}; 4 | 5 | /******/ // The require function 6 | /******/ function __webpack_require__(moduleId) { 7 | 8 | /******/ // Check if module is in cache 9 | /******/ if(installedModules[moduleId]) 10 | /******/ return installedModules[moduleId].exports; 11 | 12 | /******/ // Create a new module (and put it into the cache) 13 | /******/ var module = installedModules[moduleId] = { 14 | /******/ exports: {}, 15 | /******/ id: moduleId, 16 | /******/ loaded: false 17 | /******/ }; 18 | 19 | /******/ // Execute the module function 20 | /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); 21 | 22 | /******/ // Flag the module as loaded 23 | /******/ module.loaded = true; 24 | 25 | /******/ // Return the exports of the module 26 | /******/ return module.exports; 27 | /******/ } 28 | 29 | 30 | /******/ // expose the modules object (__webpack_modules__) 31 | /******/ __webpack_require__.m = modules; 32 | 33 | /******/ // expose the module cache 34 | /******/ __webpack_require__.c = installedModules; 35 | 36 | /******/ // __webpack_public_path__ 37 | /******/ __webpack_require__.p = ""; 38 | 39 | /******/ // Load entry module and return exports 40 | /******/ return __webpack_require__(0); 41 | /******/ }) 42 | /************************************************************************/ 43 | /******/ ([ 44 | /* 0 */ 45 | /***/ function(module, exports) { 46 | 47 | "use strict"; 48 | describe('BusyDirective', function () { 49 | // forthcoming... 50 | }); 51 | 52 | 53 | /***/ } 54 | /******/ ]); -------------------------------------------------------------------------------- /src/busy-config.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @file Busy Config 3 | * @author yumao 4 | */ 5 | 6 | import {Subscription} from 'rxjs/Subscription'; 7 | 8 | export class BusyConfig implements IBusyConfig { 9 | template: string; 10 | delay: number; 11 | minDuration: number; 12 | backdrop: boolean; 13 | message: string; 14 | wrapperClass: string; 15 | 16 | constructor(config: IBusyConfig = {}) { 17 | for (let option in BUSY_CONFIG_DEFAULTS) { 18 | this[option] = config[option] != null ? config[option] : BUSY_CONFIG_DEFAULTS[option]; 19 | } 20 | } 21 | } 22 | 23 | export interface IBusyConfig { 24 | template?: string; 25 | delay?: number; 26 | minDuration?: number; 27 | backdrop?: boolean; 28 | message?: string; 29 | wrapperClass?: string; 30 | busy?: Promise | Subscription | Array | Subscription> 31 | } 32 | 33 | export const BUSY_CONFIG_DEFAULTS = { 34 | template: ` 35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
{{message}}
52 |
53 |
54 | `, 55 | delay: 0, 56 | minDuration: 0, 57 | backdrop: true, 58 | message: 'Please wait...', 59 | wrapperClass: 'ng-busy' 60 | }; 61 | -------------------------------------------------------------------------------- /demo/app/options/options.component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 | 6 |
7 |
8 |
9 | 10 |
11 | 12 |
13 |
14 |
15 | 16 |
17 | 18 |
19 |
20 |
21 | 22 |
23 | 27 |
28 |
29 |
30 | 31 |
32 | 37 |
38 |
39 |
40 | 41 |
42 |
43 | -------------------------------------------------------------------------------- /src/style/busy.less: -------------------------------------------------------------------------------- 1 | .ng-busy { 2 | z-index: 1002; 3 | 4 | &, 5 | > *, 6 | > ng-component > * { 7 | position: absolute; 8 | top: 0px; 9 | left: 0px; 10 | right: 0px; 11 | bottom: 0px; 12 | } 13 | } 14 | 15 | .ng-busy-backdrop { 16 | position: absolute; 17 | top: 0; 18 | left: 0; 19 | right: 0; 20 | bottom: 0; 21 | z-index: 1001; 22 | background: #fff; 23 | opacity: .7; 24 | } 25 | 26 | .ng-busy-default-wrapper { 27 | text-align: center; 28 | } 29 | 30 | .ng-busy-default-sign { 31 | position: relative; 32 | display: inline-block; 33 | z-index: 1003; 34 | padding: 12px 14px; 35 | border: 1px solid #d8d8d8; 36 | border-top: 0; 37 | border-radius: 4px; 38 | border-top-left-radius: 0; 39 | border-top-right-radius: 0; 40 | box-shadow: 0 1px 2px rgba(0, 0, 0, .05); 41 | background: #f8f8f8; 42 | color: #333; 43 | } 44 | 45 | .ng-busy-default-text { 46 | display: inline-block; 47 | margin-left: 6px; 48 | max-width: 400px; 49 | font-size: 14px; 50 | text-align: left; 51 | } 52 | 53 | .ng-busy-default-spinner { 54 | position: relative; 55 | display: inline-block; 56 | width: 25px; 57 | height: 25px; 58 | vertical-align: middle; 59 | 60 | div { 61 | position: absolute; 62 | left: 44.5%; 63 | top: 37%; 64 | width: 10%; 65 | height: 26%; 66 | background: #666; 67 | border-radius: 50px; 68 | box-shadow: 0 0 3px rgba(0, 0, 0, .2); 69 | opacity: 0; 70 | animation: busy-spinner-anim 1s linear infinite; 71 | } 72 | 73 | .generate-bars(@n, @i: 1) when (@i =< @n) { 74 | .bar@{i} { 75 | transform: rotate(unit(360 / 12 * (@i - 1), deg)) translate(0, -142%); 76 | animation-delay: unit(-1 + 1 / 12 * (@i - 1), s); 77 | } 78 | .generate-bars(@n, (@i + 1)); 79 | } 80 | 81 | .generate-bars(12); 82 | } 83 | 84 | @keyframes busy-spinner-anim { 85 | from { 86 | opacity: 1; 87 | } 88 | to { 89 | opacity: 0.25; 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /src/util.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @file Util 3 | * @author yumao 4 | */ 5 | 6 | // from AngularJS 7 | 8 | export function isDate(value) { 9 | return Object.prototype.toString.call(value) === '[object Date]'; 10 | } 11 | 12 | export function isRegExp(value) { 13 | return Object.prototype.toString.call(value) === '[object RegExp]'; 14 | } 15 | 16 | export function isWindow(obj) { 17 | return obj && obj.window === obj; 18 | } 19 | 20 | export function isFunction(value) { 21 | return typeof value === 'function'; 22 | } 23 | 24 | export function isDefined(value) { 25 | return typeof value !== 'undefined'; 26 | } 27 | 28 | export function equals(o1, o2) { 29 | if (o1 === o2) { 30 | return true 31 | }; 32 | if (o1 === null || o2 === null) { 33 | return false; 34 | } 35 | if (o1 !== o1 && o2 !== o2) { 36 | return true; // NaN === NaN 37 | } 38 | const t1 = typeof o1; 39 | const t2 = typeof o2; 40 | let length; 41 | let key; 42 | let keySet; 43 | if (t1 === t2 && t1 === 'object') { 44 | if (Array.isArray(o1)) { 45 | if (!Array.isArray(o2)) { 46 | return false; 47 | } 48 | if ((length = o1.length) === o2.length) { 49 | for (key = 0; key < length; key++) { 50 | if (!equals(o1[key], o2[key])) { 51 | return false; 52 | } 53 | } 54 | return true; 55 | } 56 | } 57 | else if (isDate(o1)) { 58 | if (!isDate(o2)) { 59 | return false; 60 | } 61 | return equals(o1.getTime(), o2.getTime()); 62 | } 63 | else if (isRegExp(o1)) { 64 | if (!isRegExp(o2)) { 65 | return false; 66 | } 67 | return o1.toString() === o2.toString(); 68 | } 69 | else { 70 | if (isWindow(o1) || isWindow(o2) 71 | || Array.isArray(o2) || isDate(o2) || isRegExp(o2) 72 | ) { 73 | return false 74 | }; 75 | keySet = Object.create(null); 76 | for (key in o1) { 77 | if (key.charAt(0) === '$' || isFunction(o1[key])) { 78 | continue 79 | }; 80 | if (!equals(o1[key], o2[key])) { 81 | return false; 82 | } 83 | keySet[key] = true; 84 | } 85 | for (key in o2) { 86 | if (!(key in keySet) 87 | && key.charAt(0) !== '$' 88 | && isDefined(o2[key]) 89 | && !isFunction(o2[key]) 90 | ) { 91 | return false; 92 | } 93 | } 94 | return true; 95 | } 96 | } 97 | return false; 98 | } 99 | -------------------------------------------------------------------------------- /src/busy.component.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @file Component: Busy 3 | * @author yumao 4 | */ 5 | 6 | import { 7 | Component, 8 | Compiler, 9 | NgModule, 10 | NgModuleFactory, 11 | Injectable, 12 | DoCheck, 13 | OnDestroy 14 | } from '@angular/core'; 15 | import {trigger, state, style, transition, animate} from '@angular/animations'; 16 | 17 | import {PromiseTrackerService} from './promise-tracker.service'; 18 | 19 | 20 | const inactiveStyle = style({ 21 | opacity: 0, 22 | transform: 'translateY(-40px)' 23 | }); 24 | const timing = '.3s ease'; 25 | 26 | export interface IBusyContext { 27 | message: string; 28 | }; 29 | 30 | @Component({ 31 | selector: 'ng-busy', 32 | template: ` 33 |
34 | 35 |
36 | `, 37 | animations: [ 38 | trigger('flyInOut', [ 39 | transition('void => *', [ 40 | inactiveStyle, 41 | animate(timing) 42 | ]), 43 | transition('* => void', [ 44 | animate(timing, inactiveStyle) 45 | ]) 46 | ]) 47 | ] 48 | }) 49 | export class BusyComponent implements DoCheck, OnDestroy { 50 | TemplateComponent; 51 | private nmf: NgModuleFactory; 52 | wrapperClass: string; 53 | template: string; 54 | message: string; 55 | private lastMessage: string; 56 | 57 | constructor( 58 | private tracker: PromiseTrackerService, 59 | private compiler: Compiler 60 | ) {} 61 | 62 | ngDoCheck() { 63 | if (this.message === this.lastMessage) { 64 | return; 65 | } 66 | this.lastMessage = this.message; 67 | this.clearDynamicTemplateCache(); 68 | this.createDynamicTemplate(); 69 | } 70 | 71 | ngOnDestroy(): void { 72 | this.clearDynamicTemplateCache(); 73 | } 74 | 75 | createDynamicTemplate() { 76 | const {template, message} = this; 77 | 78 | @Component({template}) 79 | class TemplateComponent { 80 | message: string = message; 81 | } 82 | 83 | @NgModule({ 84 | declarations: [TemplateComponent], 85 | entryComponents: [TemplateComponent] 86 | }) 87 | class TemplateModule {} 88 | 89 | this.TemplateComponent = TemplateComponent; 90 | this.nmf = this.compiler.compileModuleSync(TemplateModule); 91 | } 92 | 93 | clearDynamicTemplateCache() { 94 | if (!this.nmf) { 95 | return; 96 | } 97 | 98 | this.compiler.clearCacheFor(this.nmf.moduleType); 99 | this.nmf = null; 100 | } 101 | 102 | isActive() { 103 | return this.tracker.isActive(); 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular2-busy", 3 | "description": "Angular 2 Busy: show busy/loading indicators on any promise, or on any Observable's subscription", 4 | "version": "2.0.4", 5 | "repository": { 6 | "type": "git", 7 | "url": "git+https://github.com/devyumao/angular2-busy.git" 8 | }, 9 | "keywords": [ 10 | "angular", 11 | "angular2", 12 | "busy", 13 | "loading", 14 | "angular2-busy", 15 | "ng2-busy" 16 | ], 17 | "author": "Yumao", 18 | "license": "MIT", 19 | "main": "index.js", 20 | "typings": "", 21 | "homepage": "https://github.com/devyumao/angular2-busy", 22 | "bugs": { 23 | "url": "https://github.com/devyumao/angular2-busy" 24 | }, 25 | "scripts": { 26 | "build": "cross-env NODE_ENV=busy webpack --progress", 27 | "watch": "cross-env NODE_ENV=busy webpack --inline --progress --profile --colors --watch --display-error-details --display-cached --content-base build", 28 | "build:busy": "npm run build", 29 | "watch:busy": "npm run watch", 30 | "build:demo": "cross-env NODE_ENV=demo webpack --progress", 31 | "watch:demo": "cross-env NODE_ENV=demo webpack-dev-server --inline --progress --profile --colors --watch --display-error-details --display-cached --content-base demo/asset", 32 | "test": "cross-env NODE_ENV=test webpack --inline --progress --colors --watch --content-base test", 33 | "ngc": "node_modules/.bin/ngc", 34 | "tsc": "node_modules/.bin/tsc" 35 | }, 36 | "peerDependencies": { 37 | "@angular/animations": "^4.0.0", 38 | "@angular/common": "^4.0.0", 39 | "@angular/core": "^4.0.0", 40 | "@angular/platform-browser": "^4.0.0", 41 | "rxjs": "^5.0.0" 42 | }, 43 | "devDependencies": { 44 | "@angular/animations": "^4.0.1", 45 | "@angular/common": "^4.0.1", 46 | "@angular/compiler": "^4.0.1", 47 | "@angular/compiler-cli": "^4.0.1", 48 | "@angular/core": "^4.0.1", 49 | "@angular/forms": "^4.0.1", 50 | "@angular/http": "^4.0.1", 51 | "@angular/platform-browser": "^4.0.1", 52 | "@angular/platform-browser-dynamic": "^4.0.1", 53 | "@angular/router": "^4.0.1", 54 | "@types/core-js": "^0.9.41", 55 | "autoprefixer": "^6.3.7", 56 | "awesome-typescript-loader": "^0.19.1", 57 | "bootstrap": "^4.0.0-alpha.2", 58 | "compression-webpack-plugin": "^0.3.2", 59 | "copy-webpack-plugin": "^3.0.1", 60 | "core-js": "^2.4.1", 61 | "cross-env": "^3.2.3", 62 | "extract-text-webpack-plugin": "^1.0.1", 63 | "html-webpack-plugin": "^2.28.0", 64 | "install": "^0.8.7", 65 | "jasmine-core": "^2.4.1", 66 | "less": "^2.7.2", 67 | "less-loader": "^2.2.3", 68 | "postcss-loader": "^0.9.1", 69 | "raw-loader": "^0.5.1", 70 | "reflect-metadata": "^0.1.3", 71 | "rxjs": "~5.1.1", 72 | "ts-loader": "^0.8.2", 73 | "tslint": "~4.5.0", 74 | "typescript": "~2.2.0", 75 | "typings": "^0.8.1", 76 | "webpack": "^1.12.15", 77 | "webpack-dev-server": "^1.14.1", 78 | "zone.js": "^0.8.5" 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /config/webpack.demo.js: -------------------------------------------------------------------------------- 1 | var webpack = require('webpack'); 2 | var ForkCheckerPlugin = require('awesome-typescript-loader').ForkCheckerPlugin; 3 | var HtmlWebpackPlugin = require('html-webpack-plugin'); 4 | var CopyWebpackPlugin = require('copy-webpack-plugin'); 5 | var DedupePlugin = webpack.optimize.DedupePlugin; 6 | var UglifyJsPlugin = webpack.optimize.UglifyJsPlugin; 7 | var CompressionPlugin = require('compression-webpack-plugin'); 8 | var autoprefixer = require('autoprefixer'); 9 | 10 | var helper = require('./helper'); 11 | 12 | module.exports = { 13 | debug: true, 14 | 15 | context: helper.root('demo'), 16 | 17 | entry: { 18 | 'vendor': 'vendor.ts', 19 | 'main': 'main.ts' 20 | }, 21 | 22 | output: { 23 | path: helper.root('demo/asset'), 24 | filename: 'js/[name].js' 25 | }, 26 | 27 | resolve: { 28 | extensions: ['', '.ts', '.js'], 29 | root: helper.root('demo'), 30 | modulesDirectories: ['node_modules'] 31 | }, 32 | 33 | module: { 34 | loaders: [ 35 | { 36 | test: /\.ts$/, 37 | loader: 'awesome-typescript', 38 | exclude: [/\.(spec|e2e)\.ts$/] 39 | }, 40 | { 41 | test: /\.css$/, 42 | loader: 'raw' 43 | }, 44 | { 45 | test: /\.less$/, 46 | loader: 'raw!postcss!less' 47 | }, 48 | { 49 | test: /\.html$/, 50 | loader: 'raw' 51 | } 52 | ] 53 | }, 54 | 55 | postcss: [ 56 | autoprefixer() 57 | ], 58 | 59 | plugins: [ 60 | new ForkCheckerPlugin(), 61 | 62 | new webpack.optimize.CommonsChunkPlugin({ 63 | name: ['main', 'vendor'] 64 | }), 65 | 66 | new HtmlWebpackPlugin({ 67 | template: 'index.html', 68 | inject: 'body', 69 | chunks: ['vendor', 'main'] 70 | }), 71 | 72 | new CopyWebpackPlugin([ 73 | { 74 | from: helper.root('node_modules/bootstrap/dist/css/bootstrap.min.css'), 75 | to: 'css/' 76 | }, 77 | { 78 | from: helper.root('build/style/busy.css'), 79 | to: 'css/' 80 | } 81 | ]), 82 | 83 | // prod 84 | 85 | // new DedupePlugin(), 86 | 87 | // new UglifyJsPlugin({ 88 | // beautify: false, 89 | // mangle: { 90 | // screw_ie8 : true, 91 | // keep_fnames: true 92 | // }, 93 | // compress: { 94 | // screw_ie8: true 95 | // }, 96 | // comments: false 97 | // }), 98 | 99 | // new CompressionPlugin({ 100 | // regExp: /\.css$|\.html$|\.js$|\.map$/, 101 | // threshold: 2 * 1024 102 | // }) 103 | ], 104 | 105 | devServer: { 106 | port: 8999, 107 | host: 'localhost', 108 | historyApiFallback: true, 109 | watchOptions: { 110 | aggregateTimeout: 300 111 | }, 112 | outputPath: helper.root('demo/asset') 113 | } 114 | }; 115 | -------------------------------------------------------------------------------- /src/promise-tracker.service.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @file Service: PromiseTracker 3 | * @author yumao 4 | */ 5 | 6 | // Inspired by angular-promise-tracker 7 | // Add Observable Subscription 8 | 9 | import {Injectable} from '@angular/core'; 10 | import {Subscription} from 'rxjs/Subscription'; 11 | 12 | @Injectable() 13 | export class PromiseTrackerService { 14 | promiseList: Array | Subscription> = []; 15 | delayPromise: number | any; 16 | durationPromise: number | any; 17 | delayJustFinished: boolean = false; 18 | minDuration: number; 19 | 20 | reset(options: IPromiseTrackerOptions) { 21 | this.minDuration = options.minDuration; 22 | 23 | this.promiseList = []; 24 | options.promiseList.forEach(promise => { 25 | if (!promise || promise['busyFulfilled']) { 26 | return; 27 | } 28 | this.addPromise(promise); 29 | }); 30 | 31 | if (this.promiseList.length === 0) { 32 | return; 33 | } 34 | 35 | this.delayJustFinished = false; 36 | if (options.delay) { 37 | this.delayPromise = setTimeout( 38 | () => { 39 | this.delayPromise = null; 40 | this.delayJustFinished = true; 41 | }, 42 | options.delay 43 | ); 44 | } 45 | if (options.minDuration) { 46 | this.durationPromise = setTimeout( 47 | () => { 48 | this.durationPromise = null; 49 | }, 50 | options.minDuration + (options.delay || 0) 51 | ); 52 | } 53 | } 54 | 55 | private addPromise(promise: Promise | Subscription) { 56 | if (this.promiseList.indexOf(promise) !== -1) { 57 | return; 58 | } 59 | 60 | this.promiseList.push(promise); 61 | 62 | if (promise instanceof Promise) { 63 | promise.then.call( 64 | promise, 65 | () => this.finishPromise(promise), 66 | () => this.finishPromise(promise) 67 | ); 68 | } 69 | else if (promise instanceof Subscription) { 70 | promise.add(() => this.finishPromise(promise)); 71 | } 72 | } 73 | 74 | private finishPromise(promise: Promise | Subscription) { 75 | promise['busyFulfilled'] = true; 76 | const index = this.promiseList.indexOf(promise); 77 | if (index === -1) { 78 | return; 79 | } 80 | this.promiseList.splice(index, 1); 81 | } 82 | 83 | isActive() { 84 | if (this.delayPromise) { 85 | return false; 86 | } 87 | 88 | if (!this.delayJustFinished) { 89 | if (this.durationPromise) { 90 | return true; 91 | } 92 | return this.promiseList.length > 0; 93 | } 94 | 95 | this.delayJustFinished = false; 96 | if (this.promiseList.length === 0) { 97 | this.durationPromise = null; 98 | } 99 | return this.promiseList.length > 0; 100 | } 101 | } 102 | 103 | export interface IPromiseTrackerOptions { 104 | minDuration: number; 105 | delay: number; 106 | promiseList: Promise[]; 107 | } 108 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rules": { 3 | "member-access": false, 4 | "member-ordering": [ 5 | true, 6 | "public-before-private", 7 | "static-before-instance", 8 | "variables-before-functions" 9 | ], 10 | "no-any": false, 11 | "no-inferrable-types": false, 12 | "no-internal-module": true, 13 | "no-var-requires": false, 14 | "typedef": false, 15 | "typedef-whitespace": [ 16 | true, 17 | { 18 | "call-signature": "nospace", 19 | "index-signature": "nospace", 20 | "parameter": "nospace", 21 | "property-declaration": "nospace", 22 | "variable-declaration": "nospace" 23 | }, 24 | { 25 | "call-signature": "space", 26 | "index-signature": "space", 27 | "parameter": "space", 28 | "property-declaration": "space", 29 | "variable-declaration": "space" 30 | } 31 | ], 32 | 33 | "ban": false, 34 | "curly": false, 35 | "forin": true, 36 | "label-position": true, 37 | "label-undefined": true, 38 | "no-arg": true, 39 | "no-bitwise": true, 40 | "no-conditional-assignment": true, 41 | "no-console": [ 42 | true, 43 | "debug", 44 | "info", 45 | "time", 46 | "timeEnd", 47 | "trace" 48 | ], 49 | "no-construct": true, 50 | "no-debugger": true, 51 | "no-duplicate-key": true, 52 | "no-duplicate-variable": true, 53 | "no-empty": false, 54 | "no-eval": true, 55 | "no-null-keyword": true, 56 | "no-shadowed-variable": true, 57 | "no-string-literal": true, 58 | "no-switch-case-fall-through": true, 59 | "no-unreachable": true, 60 | "no-unused-expression": true, 61 | "no-unused-variable": false, 62 | "no-use-before-declare": true, 63 | "no-var-keyword": true, 64 | "radix": true, 65 | "switch-default": true, 66 | "triple-equals": [ 67 | true, 68 | "allow-null-check" 69 | ], 70 | "use-strict": [ 71 | true, 72 | "check-module" 73 | ], 74 | 75 | "eofline": true, 76 | "indent": [ 77 | true, 78 | "spaces" 79 | ], 80 | "max-line-length": [ 81 | true, 82 | 100 83 | ], 84 | "no-require-imports": false, 85 | "no-trailing-whitespace": true, 86 | "object-literal-sort-keys": false, 87 | "trailing-comma": [ 88 | true, 89 | { 90 | "multiline": "never", 91 | "singleline": "never" 92 | } 93 | ], 94 | 95 | "align": false, 96 | "class-name": true, 97 | "comment-format": [ 98 | true, 99 | "check-space" 100 | ], 101 | "interface-name": false, 102 | "jsdoc-format": true, 103 | "no-consecutive-blank-lines": false, 104 | "no-constructor-vars": false, 105 | "one-line": [ 106 | true, 107 | "check-open-brace", 108 | "check-catch", 109 | "check-else", 110 | "check-finally", 111 | "check-whitespace" 112 | ], 113 | "quotemark": [ 114 | true, 115 | "single", 116 | "avoid-escape" 117 | ], 118 | "semicolon": [true, "always"], 119 | "variable-name": [ 120 | true, 121 | "check-format", 122 | "allow-leading-underscore", 123 | "ban-keywords" 124 | ], 125 | "whitespace": [ 126 | true, 127 | "check-branch", 128 | "check-decl", 129 | "check-operator", 130 | "check-separator", 131 | "check-type" 132 | ] 133 | 134 | } 135 | } 136 | -------------------------------------------------------------------------------- /src/busy.directive.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * @file Directive: Busy 3 | * @author yumao 4 | */ 5 | 6 | import { 7 | Directive, 8 | Component, 9 | Input, 10 | DoCheck, 11 | ViewContainerRef, 12 | ComponentFactoryResolver, 13 | ComponentRef, 14 | Injector 15 | } from '@angular/core'; 16 | import {Subscription} from 'rxjs/Subscription'; 17 | 18 | import {equals} from './util'; 19 | import {PromiseTrackerService} from './promise-tracker.service'; 20 | import {BusyService} from './busy.service'; 21 | import {IBusyConfig} from './busy-config'; 22 | import {BusyComponent} from './busy.component'; 23 | import {BusyBackdropComponent} from './busy-backdrop.component'; 24 | 25 | /** 26 | * ### Syntax 27 | * 28 | * - `
...
` 29 | * - `
...
` 30 | * - `
...
` 31 | */ 32 | @Directive({ 33 | selector: '[ngBusy]', 34 | providers: [PromiseTrackerService] 35 | }) 36 | export class BusyDirective implements DoCheck { 37 | @Input('ngBusy') options: any; 38 | private optionsRecord: any; 39 | private optionsNorm: IBusyConfig; 40 | template: string; 41 | backdrop: boolean; 42 | private busyRef: ComponentRef; 43 | private backdropRef: ComponentRef; 44 | 45 | constructor( 46 | private service: BusyService, 47 | private tracker: PromiseTrackerService, 48 | private cfResolver: ComponentFactoryResolver, 49 | private vcRef: ViewContainerRef, 50 | private injector: Injector 51 | ) { 52 | } 53 | 54 | private normalizeOptions(options: any) { 55 | if (!options) { 56 | options = {busy: null}; 57 | } 58 | else if (Array.isArray(options) 59 | || options instanceof Promise 60 | || options instanceof Subscription 61 | ) { 62 | options = {busy: options}; 63 | } 64 | options = Object.assign({}, this.service.config, options); 65 | if (!Array.isArray(options.busy)) { 66 | options.busy = [options.busy]; 67 | } 68 | 69 | return options; 70 | } 71 | 72 | private dectectOptionsChange() { 73 | if (equals(this.optionsNorm, this.optionsRecord)) { 74 | return false; 75 | } 76 | this.optionsRecord = this.optionsNorm; 77 | return true; 78 | } 79 | 80 | // As ngOnChanges does not work on Object detection, ngDoCheck is using 81 | ngDoCheck() { 82 | const options = this.optionsNorm = this.normalizeOptions(this.options); 83 | 84 | if (!this.dectectOptionsChange()) { 85 | return; 86 | } 87 | 88 | if (this.busyRef) { 89 | this.busyRef.instance.message = options.message; 90 | } 91 | 92 | !equals(options.busy, this.tracker.promiseList) 93 | && this.tracker.reset({ 94 | promiseList: options.busy, 95 | delay: options.delay, 96 | minDuration: options.minDuration 97 | }); 98 | 99 | if (!this.busyRef 100 | || this.template !== options.template 101 | || this.backdrop !== options.backdrop 102 | ) { 103 | this.destroyComponents(); 104 | 105 | this.template = options.template; 106 | this.backdrop = options.backdrop; 107 | 108 | options.backdrop && this.createBackdrop(); 109 | 110 | this.createBusy(); 111 | } 112 | } 113 | 114 | ngOnDestroy() { 115 | this.destroyComponents(); 116 | } 117 | 118 | private destroyComponents() { 119 | this.busyRef && this.busyRef.destroy(); 120 | this.backdropRef && this.backdropRef.destroy(); 121 | } 122 | 123 | private createBackdrop() { 124 | const backdropFactory = this.cfResolver.resolveComponentFactory(BusyBackdropComponent); 125 | this.backdropRef = this.vcRef.createComponent(backdropFactory, null, this.injector); 126 | } 127 | 128 | private createBusy() { 129 | const busyFactory = this.cfResolver.resolveComponentFactory(BusyComponent); 130 | this.busyRef = this.vcRef.createComponent(busyFactory, null, this.injector); 131 | 132 | const {message, wrapperClass, template} = this.optionsNorm; 133 | const instance = this.busyRef.instance; 134 | instance.message = message; 135 | instance.wrapperClass = wrapperClass; 136 | instance.template = template; 137 | } 138 | } 139 | -------------------------------------------------------------------------------- /demo/asset/css/busy.css: -------------------------------------------------------------------------------- 1 | .ng-busy { 2 | z-index: 1002; 3 | } 4 | .ng-busy, 5 | .ng-busy > *, 6 | .ng-busy > ng-component > * { 7 | position: absolute; 8 | top: 0px; 9 | left: 0px; 10 | right: 0px; 11 | bottom: 0px; 12 | } 13 | .ng-busy-backdrop { 14 | position: absolute; 15 | top: 0; 16 | left: 0; 17 | right: 0; 18 | bottom: 0; 19 | z-index: 1001; 20 | background: #fff; 21 | opacity: .7; 22 | } 23 | .ng-busy-default-wrapper { 24 | text-align: center; 25 | } 26 | .ng-busy-default-sign { 27 | position: relative; 28 | display: inline-block; 29 | z-index: 1003; 30 | padding: 12px 14px; 31 | border: 1px solid #d8d8d8; 32 | border-top: 0; 33 | border-radius: 4px; 34 | border-top-left-radius: 0; 35 | border-top-right-radius: 0; 36 | box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); 37 | background: #f8f8f8; 38 | color: #333; 39 | } 40 | .ng-busy-default-text { 41 | display: inline-block; 42 | margin-left: 6px; 43 | max-width: 400px; 44 | font-size: 14px; 45 | text-align: left; 46 | } 47 | .ng-busy-default-spinner { 48 | position: relative; 49 | display: inline-block; 50 | width: 25px; 51 | height: 25px; 52 | vertical-align: middle; 53 | } 54 | .ng-busy-default-spinner div { 55 | position: absolute; 56 | left: 44.5%; 57 | top: 37%; 58 | width: 10%; 59 | height: 26%; 60 | background: #666; 61 | border-radius: 50px; 62 | box-shadow: 0 0 3px rgba(0, 0, 0, 0.2); 63 | opacity: 0; 64 | -webkit-animation: busy-spinner-anim 1s linear infinite; 65 | animation: busy-spinner-anim 1s linear infinite; 66 | } 67 | .ng-busy-default-spinner .bar1 { 68 | -webkit-transform: rotate(0deg) translate(0, -142%); 69 | transform: rotate(0deg) translate(0, -142%); 70 | -webkit-animation-delay: -1s; 71 | animation-delay: -1s; 72 | } 73 | .ng-busy-default-spinner .bar2 { 74 | -webkit-transform: rotate(30deg) translate(0, -142%); 75 | transform: rotate(30deg) translate(0, -142%); 76 | -webkit-animation-delay: -0.91666667s; 77 | animation-delay: -0.91666667s; 78 | } 79 | .ng-busy-default-spinner .bar3 { 80 | -webkit-transform: rotate(60deg) translate(0, -142%); 81 | transform: rotate(60deg) translate(0, -142%); 82 | -webkit-animation-delay: -0.83333333s; 83 | animation-delay: -0.83333333s; 84 | } 85 | .ng-busy-default-spinner .bar4 { 86 | -webkit-transform: rotate(90deg) translate(0, -142%); 87 | transform: rotate(90deg) translate(0, -142%); 88 | -webkit-animation-delay: -0.75s; 89 | animation-delay: -0.75s; 90 | } 91 | .ng-busy-default-spinner .bar5 { 92 | -webkit-transform: rotate(120deg) translate(0, -142%); 93 | transform: rotate(120deg) translate(0, -142%); 94 | -webkit-animation-delay: -0.66666667s; 95 | animation-delay: -0.66666667s; 96 | } 97 | .ng-busy-default-spinner .bar6 { 98 | -webkit-transform: rotate(150deg) translate(0, -142%); 99 | transform: rotate(150deg) translate(0, -142%); 100 | -webkit-animation-delay: -0.58333333s; 101 | animation-delay: -0.58333333s; 102 | } 103 | .ng-busy-default-spinner .bar7 { 104 | -webkit-transform: rotate(180deg) translate(0, -142%); 105 | transform: rotate(180deg) translate(0, -142%); 106 | -webkit-animation-delay: -0.5s; 107 | animation-delay: -0.5s; 108 | } 109 | .ng-busy-default-spinner .bar8 { 110 | -webkit-transform: rotate(210deg) translate(0, -142%); 111 | transform: rotate(210deg) translate(0, -142%); 112 | -webkit-animation-delay: -0.41666667s; 113 | animation-delay: -0.41666667s; 114 | } 115 | .ng-busy-default-spinner .bar9 { 116 | -webkit-transform: rotate(240deg) translate(0, -142%); 117 | transform: rotate(240deg) translate(0, -142%); 118 | -webkit-animation-delay: -0.33333333s; 119 | animation-delay: -0.33333333s; 120 | } 121 | .ng-busy-default-spinner .bar10 { 122 | -webkit-transform: rotate(270deg) translate(0, -142%); 123 | transform: rotate(270deg) translate(0, -142%); 124 | -webkit-animation-delay: -0.25s; 125 | animation-delay: -0.25s; 126 | } 127 | .ng-busy-default-spinner .bar11 { 128 | -webkit-transform: rotate(300deg) translate(0, -142%); 129 | transform: rotate(300deg) translate(0, -142%); 130 | -webkit-animation-delay: -0.16666667s; 131 | animation-delay: -0.16666667s; 132 | } 133 | .ng-busy-default-spinner .bar12 { 134 | -webkit-transform: rotate(330deg) translate(0, -142%); 135 | transform: rotate(330deg) translate(0, -142%); 136 | -webkit-animation-delay: -0.08333333s; 137 | animation-delay: -0.08333333s; 138 | } 139 | @-webkit-keyframes busy-spinner-anim { 140 | from { 141 | opacity: 1; 142 | } 143 | to { 144 | opacity: 0.25; 145 | } 146 | } 147 | @keyframes busy-spinner-anim { 148 | from { 149 | opacity: 1; 150 | } 151 | to { 152 | opacity: 0.25; 153 | } 154 | } 155 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Angular2-Busy 2 | 3 | [![npm version](https://img.shields.io/npm/v/angular2-busy.svg?style=flat-square)](https://www.npmjs.com/package/angular2-busy) [![Build Status](https://img.shields.io/travis/devyumao/angular2-busy/master.svg?style=flat-square)](https://travis-ci.org/devyumao/angular2-busy) 4 | 5 | **Angular 2 Busy** can show busy/loading indicators on any promise, or on any Observable's subscription. 6 | 7 | ![demo](https://raw.githubusercontent.com/devyumao/devyumao.github.io/master/angular2-busy/img/demo.gif) 8 | 9 | Rewritten from [angular-busy](https://github.com/cgross/angular-busy), and add some new features in terms of Angular 2. 10 | 11 | ### Built with Angular 4.0.1 12 | 13 | ## Demo 14 | 15 | [devyumao.github.io/angular2-busy/demo/asset/](http://devyumao.github.io/angular2-busy/demo/asset/) 16 | 17 | ## Installation 18 | 19 | ```shell 20 | npm install --save angular2-busy 21 | ``` 22 | 23 | ## Link CSS 24 | 25 | ```html 26 | 27 | ``` 28 | 29 | ## Getting Started 30 | 31 | Import the `BusyModule` in your root application module: 32 | 33 | ```typescript 34 | import {NgModule} from '@angular/core'; 35 | import {BrowserAnimationsModule} from '@angular/platform-browser/animations'; 36 | import {BusyModule} from 'angular2-busy'; 37 | 38 | @NgModule({ 39 | imports: [ 40 | // ... 41 | BrowserAnimationsModule, 42 | BusyModule 43 | ], 44 | // ... 45 | }) 46 | export class AppModule {} 47 | ``` 48 | 49 | 50 | Reference your promise in the `ngBusy` directive: 51 | 52 | ```typescript 53 | import {Component, OnInit} from '@angular/core'; 54 | import {Http} from '@angular/http'; 55 | 56 | @Component({ 57 | selector: 'some', 58 | template: ` 59 |
60 | ` 61 | }) 62 | class SomeComponent implements OnInit { 63 | busy: Promise; 64 | 65 | constructor(private http: Http) {} 66 | 67 | ngOnInit() { 68 | this.busy = this.http.get('...').toPromise(); 69 | } 70 | } 71 | ``` 72 | 73 | Moreover, the subscription of an Observable is also supported: 74 | 75 | ```typescript 76 | // ... 77 | import {Subscription} from 'rxjs'; 78 | 79 | // ... 80 | class SomeComponent implements OnInit { 81 | busy: Subscription; 82 | 83 | // ... 84 | 85 | ngOnInit() { 86 | this.busy = this.http.get('...').subscribe(); 87 | } 88 | } 89 | ``` 90 | 91 | ## Directive Syntax 92 | 93 | The `ngBusy` directive expects a ***busy thing***, which means: 94 | - A promise 95 | - Or an Observable's subscription 96 | - Or an array of them 97 | - Or a configuration object 98 | 99 | In other words, you may use flexible syntax: 100 | 101 | ```html 102 | 103 |
104 | ``` 105 | 106 | ```html 107 | 108 |
109 | ``` 110 | 111 | ```html 112 | 113 |
114 | ``` 115 | 116 | ## Options 117 | 118 | | Option | Required | Default | Details | 119 | | ---- | ---- | ---- | ---- | 120 | | busy | Required | null | A busy thing (or an array of busy things) that will cause the loading indicator to show. | 121 | | message | Optional | 'Please wait...' | The message to show in the indicator which will reflect the updated values as they are changed. | 122 | | backdrop | Optional | true | A faded backdrop will be shown behind the indicator if true. | 123 | | template | Optional | A default template string | If provided, the custom template will be shown in place of the default indicatory template. The scope can be augmented with a `{{message}}` field containing the indicator message text. | 124 | | delay | Optional | 0 | The amount of time to wait until showing the indicator. Specified in milliseconds. 125 | | minDuration | Optional | 0 | The amount of time to keep the indicator showing even if the busy thing was completed quicker. Specified in milliseconds.| 126 | | wrapperClass | Optional | 'ng-busy' | The name(s) of the CSS classes to be applied to the wrapper element of the indicator. | 127 | 128 | 129 | ## Overriding Defaults 130 | 131 | The default values of options can be overriden by configuring the provider of the `BusyModule`. 132 | 133 | In the root application module, you can do this: 134 | 135 | ```typescript 136 | import {NgModule} from '@angular/core'; 137 | import {BusyModule, BusyConfig} from 'angular2-busy'; 138 | 139 | @NgModule({ 140 | imports: [ 141 | // ... 142 | BusyModule.forRoot( 143 | new BusyConfig({ 144 | message: 'Don\'t panic!', 145 | backdrop: false, 146 | template: '
{{message}}
', 147 | delay: 200, 148 | minDuration: 600, 149 | wrapperClass: 'my-class' 150 | }) 151 | ) 152 | ], 153 | // ... 154 | }) 155 | export class AppModule 156 | ``` 157 | 158 | ## FAQ 159 | 160 | ### The indicator's position is not inside the `ngBusy` container 161 | 162 | You may add `position: relative` style to your `ngBusy` container. 163 | 164 | ### SystemJS Config? 165 | 166 | You may need this in your `systemjs.config.js`: 167 | 168 | ```javascript 169 | { 170 | paths: { 171 | 'npm:': 'node_modules/' 172 | }, 173 | map: { 174 | // ... 175 | 'angular2-busy': 'npm:angular2-busy' 176 | }, 177 | packages: { 178 | // ... 179 | 'angular2-busy': { 180 | main: './index.js', 181 | defaultExtension: 'js' 182 | } 183 | } 184 | } 185 | ``` 186 | 187 | 188 | ## TODO 189 | 190 | - Provide custom animations for the indicator 191 | 192 | - Unit & E2E test 193 | 194 | ## Credits 195 | 196 | Rewritten from [cgross](https://github.com/cgross)'s [angular-busy](https://github.com/cgross/angular-busy). 197 | 198 | Inspired by [ajoslin](https://github.com/ajoslin)'s [angular-promise-tracker](https://github.com/ajoslin/angular-promise-tracker). 199 | 200 | ## LICENSE 201 | 202 | This project is licensed under the MIT license. See the [LICENSE](https://github.com/devyumao/angular2-busy/blob/master/LICENSE) file for more info. 203 | -------------------------------------------------------------------------------- /demo/asset/js/main.js: -------------------------------------------------------------------------------- 1 | webpackJsonp([0],[ 2 | /* 0 */ 3 | /***/ function(module, exports, __webpack_require__) { 4 | 5 | /** 6 | * @file main 7 | * @author yumao 8 | */ 9 | "use strict"; 10 | Object.defineProperty(exports, "__esModule", { value: true }); 11 | var platform_browser_dynamic_1 = __webpack_require__(2); 12 | var core_1 = __webpack_require__(4); 13 | var app_module_1 = __webpack_require__(39); 14 | core_1.enableProdMode(); 15 | platform_browser_dynamic_1.platformBrowserDynamic().bootstrapModule(app_module_1.AppModule); 16 | 17 | 18 | /***/ }, 19 | /* 1 */, 20 | /* 2 */, 21 | /* 3 */, 22 | /* 4 */, 23 | /* 5 */, 24 | /* 6 */, 25 | /* 7 */, 26 | /* 8 */, 27 | /* 9 */, 28 | /* 10 */, 29 | /* 11 */, 30 | /* 12 */, 31 | /* 13 */, 32 | /* 14 */, 33 | /* 15 */, 34 | /* 16 */, 35 | /* 17 */, 36 | /* 18 */, 37 | /* 19 */, 38 | /* 20 */, 39 | /* 21 */, 40 | /* 22 */, 41 | /* 23 */, 42 | /* 24 */, 43 | /* 25 */, 44 | /* 26 */, 45 | /* 27 */, 46 | /* 28 */, 47 | /* 29 */, 48 | /* 30 */, 49 | /* 31 */, 50 | /* 32 */, 51 | /* 33 */, 52 | /* 34 */, 53 | /* 35 */, 54 | /* 36 */, 55 | /* 37 */, 56 | /* 38 */, 57 | /* 39 */ 58 | /***/ function(module, exports, __webpack_require__) { 59 | 60 | "use strict"; 61 | var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { 62 | var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; 63 | if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); 64 | else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; 65 | return c > 3 && r && Object.defineProperty(target, key, r), r; 66 | }; 67 | Object.defineProperty(exports, "__esModule", { value: true }); 68 | var core_1 = __webpack_require__(4); 69 | var platform_browser_1 = __webpack_require__(38); 70 | var http_1 = __webpack_require__(40); 71 | var forms_1 = __webpack_require__(41); 72 | var animations_1 = __webpack_require__(47); 73 | var __1 = __webpack_require__(50); 74 | // import {BusyModule, BusyConfig} from 'angular2-busy'; 75 | var app_component_1 = __webpack_require__(60); 76 | var github_corner_1 = __webpack_require__(63); 77 | var header_1 = __webpack_require__(67); 78 | var options_1 = __webpack_require__(71); 79 | var table_1 = __webpack_require__(76); 80 | var AppModule = (function () { 81 | function AppModule() { 82 | } 83 | return AppModule; 84 | }()); 85 | AppModule = __decorate([ 86 | core_1.NgModule({ 87 | imports: [ 88 | platform_browser_1.BrowserModule, 89 | forms_1.FormsModule, 90 | http_1.HttpModule, 91 | __1.BusyModule, 92 | animations_1.BrowserAnimationsModule 93 | // BusyModule.forRoot(new BusyConfig({ 94 | // message: 'test', 95 | // backdrop: false 96 | // })) 97 | ], 98 | declarations: [ 99 | app_component_1.AppComponent, 100 | github_corner_1.GithubCornerComponent, 101 | header_1.HeaderComponent, 102 | options_1.OptionsComponent, 103 | table_1.TableComponent 104 | ], 105 | bootstrap: [app_component_1.AppComponent] 106 | }) 107 | ], AppModule); 108 | exports.AppModule = AppModule; 109 | 110 | 111 | /***/ }, 112 | /* 40 */, 113 | /* 41 */, 114 | /* 42 */, 115 | /* 43 */, 116 | /* 44 */, 117 | /* 45 */, 118 | /* 46 */, 119 | /* 47 */, 120 | /* 48 */, 121 | /* 49 */, 122 | /* 50 */, 123 | /* 51 */, 124 | /* 52 */, 125 | /* 53 */, 126 | /* 54 */, 127 | /* 55 */, 128 | /* 56 */, 129 | /* 57 */, 130 | /* 58 */, 131 | /* 59 */, 132 | /* 60 */ 133 | /***/ function(module, exports, __webpack_require__) { 134 | 135 | /** 136 | * @file Component: App 137 | * @author yumao 138 | */ 139 | "use strict"; 140 | var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { 141 | var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; 142 | if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); 143 | else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; 144 | return c > 3 && r && Object.defineProperty(target, key, r), r; 145 | }; 146 | Object.defineProperty(exports, "__esModule", { value: true }); 147 | var core_1 = __webpack_require__(4); 148 | var AppComponent = (function () { 149 | function AppComponent() { 150 | } 151 | return AppComponent; 152 | }()); 153 | AppComponent = __decorate([ 154 | core_1.Component({ 155 | selector: 'app', 156 | encapsulation: core_1.ViewEncapsulation.None, 157 | template: __webpack_require__(61), 158 | styles: [__webpack_require__(62)] 159 | }) 160 | ], AppComponent); 161 | exports.AppComponent = AppComponent; 162 | 163 | 164 | /***/ }, 165 | /* 61 */ 166 | /***/ function(module, exports) { 167 | 168 | module.exports = "\n\n\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n" 169 | 170 | /***/ }, 171 | /* 62 */ 172 | /***/ function(module, exports) { 173 | 174 | module.exports = "/**\n * @file App style\n * @author yumao\n */\n.form-control:focus {\n border-color: #e86c8c;\n}\n.c-input > input:checked ~ .c-indicator {\n background-color: #b03a58;\n}\n.c-input > input:focus ~ .c-indicator {\n box-shadow: 0 0 0 0.075rem #fff, 0 0 0 0.2rem #b03a58;\n}\n.c-input > input:active ~ .c-indicator {\n background-color: #e86c8c;\n}\n.btn:focus,\n.btn:focus:active {\n outline: 0;\n}\n" 175 | 176 | /***/ }, 177 | /* 63 */ 178 | /***/ function(module, exports, __webpack_require__) { 179 | 180 | /** 181 | * @file GithubCorner index 182 | * @author yumao 183 | */ 184 | "use strict"; 185 | function __export(m) { 186 | for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; 187 | } 188 | Object.defineProperty(exports, "__esModule", { value: true }); 189 | __export(__webpack_require__(64)); 190 | 191 | 192 | /***/ }, 193 | /* 64 */ 194 | /***/ function(module, exports, __webpack_require__) { 195 | 196 | /** 197 | * @file Component: GithubCorner 198 | * @author yumao 199 | */ 200 | "use strict"; 201 | var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { 202 | var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; 203 | if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); 204 | else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; 205 | return c > 3 && r && Object.defineProperty(target, key, r), r; 206 | }; 207 | Object.defineProperty(exports, "__esModule", { value: true }); 208 | var core_1 = __webpack_require__(4); 209 | var GithubCornerComponent = (function () { 210 | function GithubCornerComponent() { 211 | } 212 | return GithubCornerComponent; 213 | }()); 214 | GithubCornerComponent = __decorate([ 215 | core_1.Component({ 216 | selector: 'github-corner', 217 | template: __webpack_require__(65), 218 | styles: [__webpack_require__(66)] 219 | }) 220 | ], GithubCornerComponent); 221 | exports.GithubCornerComponent = GithubCornerComponent; 222 | 223 | 224 | /***/ }, 225 | /* 65 */ 226 | /***/ function(module, exports) { 227 | 228 | module.exports = "\n\n \n \n \n \n \n\n" 229 | 230 | /***/ }, 231 | /* 66 */ 232 | /***/ function(module, exports) { 233 | 234 | module.exports = "/**\n * @file GithubCorner style\n * @author yumao\n */\n.github-corner svg {\n position: absolute;\n top: 0;\n border: 0;\n right: 0;\n fill: #fff;\n color: #b03a58;\n}\n.github-corner .octo-arm {\n -webkit-transform-origin: 130px 106px;\n transform-origin: 130px 106px;\n}\n.github-corner:hover .octo-arm {\n -webkit-animation: octocat-wave 560ms ease-in-out;\n animation: octocat-wave 560ms ease-in-out;\n}\n@media (max-width: 500px) {\n .github-corner .octo-arm {\n -webkit-animation: octocat-wave 560ms ease-in-out;\n animation: octocat-wave 560ms ease-in-out;\n }\n .github-corner:hover .octo-arm {\n -webkit-animation: none;\n animation: none;\n }\n}\n@-webkit-keyframes octocat-wave {\n 0%,\n 100% {\n -webkit-transform: rotate(0);\n transform: rotate(0);\n }\n 20%,\n 60% {\n -webkit-transform: rotate(-25deg);\n transform: rotate(-25deg);\n }\n 40%,\n 80% {\n -webkit-transform: rotate(10deg);\n transform: rotate(10deg);\n }\n}\n@keyframes octocat-wave {\n 0%,\n 100% {\n -webkit-transform: rotate(0);\n transform: rotate(0);\n }\n 20%,\n 60% {\n -webkit-transform: rotate(-25deg);\n transform: rotate(-25deg);\n }\n 40%,\n 80% {\n -webkit-transform: rotate(10deg);\n transform: rotate(10deg);\n }\n}\n" 235 | 236 | /***/ }, 237 | /* 67 */ 238 | /***/ function(module, exports, __webpack_require__) { 239 | 240 | /** 241 | * @file Header index 242 | * @author yumao 243 | */ 244 | "use strict"; 245 | function __export(m) { 246 | for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; 247 | } 248 | Object.defineProperty(exports, "__esModule", { value: true }); 249 | __export(__webpack_require__(68)); 250 | 251 | 252 | /***/ }, 253 | /* 68 */ 254 | /***/ function(module, exports, __webpack_require__) { 255 | 256 | /** 257 | * @file Component: Header 258 | * @author yumao 259 | */ 260 | "use strict"; 261 | var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { 262 | var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; 263 | if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); 264 | else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; 265 | return c > 3 && r && Object.defineProperty(target, key, r), r; 266 | }; 267 | Object.defineProperty(exports, "__esModule", { value: true }); 268 | var core_1 = __webpack_require__(4); 269 | var HeaderComponent = (function () { 270 | function HeaderComponent() { 271 | } 272 | return HeaderComponent; 273 | }()); 274 | HeaderComponent = __decorate([ 275 | core_1.Component({ 276 | selector: 'demo-header', 277 | template: __webpack_require__(69), 278 | styles: [__webpack_require__(70)] 279 | }) 280 | ], HeaderComponent); 281 | exports.HeaderComponent = HeaderComponent; 282 | 283 | 284 | /***/ }, 285 | /* 69 */ 286 | /***/ function(module, exports) { 287 | 288 | module.exports = "
\n
\n

Angular 2 Busy

\n

Show busy/loading indicators on any promise, or on any Observable's subscription.

\n
\n
\n" 289 | 290 | /***/ }, 291 | /* 70 */ 292 | /***/ function(module, exports) { 293 | 294 | module.exports = "/**\n * @file Header style\n * @author yumao\n */\nheader {\n padding: 3rem .9375rem;\n margin-bottom: 3rem;\n background: #b03a58;\n color: #e8bac5;\n}\nheader h1 {\n color: #fff;\n font-size: 3rem;\n}\n" 295 | 296 | /***/ }, 297 | /* 71 */ 298 | /***/ function(module, exports, __webpack_require__) { 299 | 300 | /** 301 | * @file Options index 302 | * @author yumao 303 | */ 304 | "use strict"; 305 | function __export(m) { 306 | for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; 307 | } 308 | Object.defineProperty(exports, "__esModule", { value: true }); 309 | __export(__webpack_require__(72)); 310 | 311 | 312 | /***/ }, 313 | /* 72 */ 314 | /***/ function(module, exports, __webpack_require__) { 315 | 316 | /** 317 | * @file Component: Options 318 | * @author yumao 319 | */ 320 | "use strict"; 321 | var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { 322 | var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; 323 | if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); 324 | else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; 325 | return c > 3 && r && Object.defineProperty(target, key, r), r; 326 | }; 327 | var __metadata = (this && this.__metadata) || function (k, v) { 328 | if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); 329 | }; 330 | Object.defineProperty(exports, "__esModule", { value: true }); 331 | var core_1 = __webpack_require__(4); 332 | var http_1 = __webpack_require__(40); 333 | var __1 = __webpack_require__(50); 334 | // import {BUSY_CONFIG_DEFAULTS, IBusyConfig} from 'angular2-busy'; 335 | var options_template_1 = __webpack_require__(73); 336 | var OptionsComponent = (function () { 337 | function OptionsComponent(http) { 338 | this.http = http; 339 | this.templateType = 'default'; 340 | this.data = Object.assign({}, __1.BUSY_CONFIG_DEFAULTS); 341 | } 342 | OptionsComponent.prototype.changeTemplate = function (type) { 343 | this.data.template = options_template_1.OPTIONS_TEMPLATE[type]; 344 | }; 345 | OptionsComponent.prototype.playDemo = function () { 346 | // this.data.busy = this.http.get('https://httpbin.org/delay/3') 347 | // .subscribe(); 348 | this.data.busy = this.http.get('https://httpbin.org/delay/1') 349 | .toPromise(); 350 | }; 351 | return OptionsComponent; 352 | }()); 353 | OptionsComponent = __decorate([ 354 | core_1.Component({ 355 | selector: 'demo-options', 356 | template: __webpack_require__(74), 357 | styles: [__webpack_require__(75)] 358 | }), 359 | __metadata("design:paramtypes", [typeof (_a = typeof http_1.Http !== "undefined" && http_1.Http) === "function" && _a || Object]) 360 | ], OptionsComponent); 361 | exports.OptionsComponent = OptionsComponent; 362 | var _a; 363 | 364 | 365 | /***/ }, 366 | /* 73 */ 367 | /***/ function(module, exports, __webpack_require__) { 368 | 369 | /** 370 | * @file Options Template 371 | * @author yumao 372 | */ 373 | "use strict"; 374 | Object.defineProperty(exports, "__esModule", { value: true }); 375 | var __1 = __webpack_require__(50); 376 | exports.OPTIONS_TEMPLATE = { 377 | default: __1.BUSY_CONFIG_DEFAULTS.template, 378 | custom: "\n
\n
\n {{message}}\n
\n
\n " 379 | }; 380 | 381 | 382 | /***/ }, 383 | /* 74 */ 384 | /***/ function(module, exports) { 385 | 386 | module.exports = "
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n
\n" 387 | 388 | /***/ }, 389 | /* 75 */ 390 | /***/ function(module, exports) { 391 | 392 | module.exports = "/**\n * @file Options style\n * @author yumao\n */\n.c-checkbox {\n line-height: 36px;\n}\n" 393 | 394 | /***/ }, 395 | /* 76 */ 396 | /***/ function(module, exports, __webpack_require__) { 397 | 398 | /** 399 | * @file Table index 400 | * @author yumao 401 | */ 402 | "use strict"; 403 | function __export(m) { 404 | for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; 405 | } 406 | Object.defineProperty(exports, "__esModule", { value: true }); 407 | __export(__webpack_require__(77)); 408 | 409 | 410 | /***/ }, 411 | /* 77 */ 412 | /***/ function(module, exports, __webpack_require__) { 413 | 414 | /** 415 | * @file Component: Table 416 | * @author yumao 417 | */ 418 | "use strict"; 419 | var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { 420 | var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; 421 | if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); 422 | else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; 423 | return c > 3 && r && Object.defineProperty(target, key, r), r; 424 | }; 425 | var __metadata = (this && this.__metadata) || function (k, v) { 426 | if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); 427 | }; 428 | Object.defineProperty(exports, "__esModule", { value: true }); 429 | var core_1 = __webpack_require__(4); 430 | var __1 = __webpack_require__(50); 431 | // import {IBusyConfig} from 'angular2-busy'; 432 | var TableComponent = (function () { 433 | function TableComponent() { 434 | } 435 | return TableComponent; 436 | }()); 437 | __decorate([ 438 | core_1.Input(), 439 | __metadata("design:type", typeof (_a = typeof __1.IBusyConfig !== "undefined" && __1.IBusyConfig) === "function" && _a || Object) 440 | ], TableComponent.prototype, "loading", void 0); 441 | TableComponent = __decorate([ 442 | core_1.Component({ 443 | selector: 'demo-table', 444 | template: __webpack_require__(78), 445 | styles: [__webpack_require__(79)] 446 | }) 447 | ], TableComponent); 448 | exports.TableComponent = TableComponent; 449 | var _a; 450 | 451 | 452 | /***/ }, 453 | /* 78 */ 454 | /***/ function(module, exports) { 455 | 456 | module.exports = "\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
#NameSpeciesOccupation
1Arthur DentHumanRadio Employee
2Ford PrefectBetelgeusianResearcher
3MarvinRobotServant
\n" 457 | 458 | /***/ }, 459 | /* 79 */ 460 | /***/ function(module, exports) { 461 | 462 | module.exports = "/**\n * @file Table style\n * @author yumao\n */\n.table {\n position: relative;\n}\n" 463 | 464 | /***/ } 465 | ]); -------------------------------------------------------------------------------- /demo/asset/css/bootstrap.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v4.0.0-alpha.2 (http://getbootstrap.com) 3 | * Copyright 2011-2015 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active{outline:0}a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}@media print{*,::after,::before{text-shadow:none!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}html{-webkit-box-sizing:border-box;box-sizing:border-box}*,::after,::before{-webkit-box-sizing:inherit;box-sizing:inherit}@-ms-viewport{width:device-width}@viewport{width:device-width}html{font-size:16px;-webkit-tap-highlight-color:transparent}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:1rem;line-height:1.5;color:#373a3c;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #818a91}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}a{color:#0275d8;text-decoration:none}a:focus,a:hover{color:#014c8c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}pre{margin-top:0;margin-bottom:1rem}figure{margin:0 0 1rem}img{vertical-align:middle}[role=button]{cursor:pointer}[role=button],a,area,button,input,label,select,summary,textarea{-ms-touch-action:manipulation;touch-action:manipulation}table{background-color:transparent}caption{padding-top:.75rem;padding-bottom:.75rem;color:#818a91;text-align:left;caption-side:bottom}th{text-align:left}label{display:inline-block;margin-bottom:.5rem}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,select,textarea{margin:0;line-height:inherit;border-radius:0}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit}input[type=search]{-webkit-box-sizing:inherit;box-sizing:inherit;-webkit-appearance:none}output{display:inline-block}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1{font-size:2.5rem}h2{font-size:2rem}h3{font-size:1.75rem}h4{font-size:1.5rem}h5{font-size:1.25rem}h6{font-size:1rem}.h1{font-size:2.5rem}.h2{font-size:2rem}.h3{font-size:1.75rem}.h4{font-size:1.5rem}.h5{font-size:1.25rem}.h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300}.display-2{font-size:5.5rem;font-weight:300}.display-3{font-size:4.5rem;font-weight:300}.display-4{font-size:3.5rem;font-weight:300}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:5px}.dl-horizontal{margin-right:-1.875rem;margin-left:-1.875rem}.dl-horizontal::after{display:table;clear:both;content:""}.initialism{font-size:90%;text-transform:uppercase}.blockquote{padding:.5rem 1rem;margin-bottom:1rem;font-size:1.25rem;border-left:.25rem solid #eceeef}.blockquote-footer{display:block;font-size:80%;line-height:1.5;color:#818a91}.blockquote-footer::before{content:"\2014 \00A0"}.blockquote-reverse{padding-right:1rem;padding-left:0;text-align:right;border-right:.25rem solid #eceeef;border-left:0}.blockquote-reverse .blockquote-footer::before{content:""}.blockquote-reverse .blockquote-footer::after{content:"\00A0 \2014"}.carousel-inner>.carousel-item>a>img,.carousel-inner>.carousel-item>img,.img-fluid{display:block;max-width:100%;height:auto}.img-rounded{border-radius:.3rem}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:.25rem;line-height:1.5;background-color:#fff;border:1px solid #ddd;border-radius:.25rem;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#818a91}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:.2rem .4rem;font-size:90%;color:#bd4147;background-color:#f7f7f9;border-radius:.25rem}kbd{padding:.2rem .4rem;font-size:90%;color:#fff;background-color:#333;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;margin-top:0;margin-bottom:1rem;font-size:90%;line-height:1.5;color:#373a3c}pre code{padding:0;font-size:inherit;color:inherit;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:.9375rem;padding-left:.9375rem;margin-right:auto;margin-left:auto}.container::after{display:table;clear:both;content:""}@media (min-width:544px){.container{max-width:576px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:940px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{padding-right:.9375rem;padding-left:.9375rem;margin-right:auto;margin-left:auto}.container-fluid::after{display:table;clear:both;content:""}.row{margin-right:-.9375rem;margin-left:-.9375rem}.row::after{display:table;clear:both;content:""}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:.9375rem;padding-left:.9375rem}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-1{width:8.333333%}.col-xs-2{width:16.666667%}.col-xs-3{width:25%}.col-xs-4{width:33.333333%}.col-xs-5{width:41.666667%}.col-xs-6{width:50%}.col-xs-7{width:58.333333%}.col-xs-8{width:66.666667%}.col-xs-9{width:75%}.col-xs-10{width:83.333333%}.col-xs-11{width:91.666667%}.col-xs-12{width:100%}.col-xs-pull-0{right:auto}.col-xs-pull-1{right:8.333333%}.col-xs-pull-2{right:16.666667%}.col-xs-pull-3{right:25%}.col-xs-pull-4{right:33.333333%}.col-xs-pull-5{right:41.666667%}.col-xs-pull-6{right:50%}.col-xs-pull-7{right:58.333333%}.col-xs-pull-8{right:66.666667%}.col-xs-pull-9{right:75%}.col-xs-pull-10{right:83.333333%}.col-xs-pull-11{right:91.666667%}.col-xs-pull-12{right:100%}.col-xs-push-0{left:auto}.col-xs-push-1{left:8.333333%}.col-xs-push-2{left:16.666667%}.col-xs-push-3{left:25%}.col-xs-push-4{left:33.333333%}.col-xs-push-5{left:41.666667%}.col-xs-push-6{left:50%}.col-xs-push-7{left:58.333333%}.col-xs-push-8{left:66.666667%}.col-xs-push-9{left:75%}.col-xs-push-10{left:83.333333%}.col-xs-push-11{left:91.666667%}.col-xs-push-12{left:100%}.col-xs-offset-0{margin-left:0}.col-xs-offset-1{margin-left:8.333333%}.col-xs-offset-2{margin-left:16.666667%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-4{margin-left:33.333333%}.col-xs-offset-5{margin-left:41.666667%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-7{margin-left:58.333333%}.col-xs-offset-8{margin-left:66.666667%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-10{margin-left:83.333333%}.col-xs-offset-11{margin-left:91.666667%}.col-xs-offset-12{margin-left:100%}@media (min-width:544px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-1{width:8.333333%}.col-sm-2{width:16.666667%}.col-sm-3{width:25%}.col-sm-4{width:33.333333%}.col-sm-5{width:41.666667%}.col-sm-6{width:50%}.col-sm-7{width:58.333333%}.col-sm-8{width:66.666667%}.col-sm-9{width:75%}.col-sm-10{width:83.333333%}.col-sm-11{width:91.666667%}.col-sm-12{width:100%}.col-sm-pull-0{right:auto}.col-sm-pull-1{right:8.333333%}.col-sm-pull-2{right:16.666667%}.col-sm-pull-3{right:25%}.col-sm-pull-4{right:33.333333%}.col-sm-pull-5{right:41.666667%}.col-sm-pull-6{right:50%}.col-sm-pull-7{right:58.333333%}.col-sm-pull-8{right:66.666667%}.col-sm-pull-9{right:75%}.col-sm-pull-10{right:83.333333%}.col-sm-pull-11{right:91.666667%}.col-sm-pull-12{right:100%}.col-sm-push-0{left:auto}.col-sm-push-1{left:8.333333%}.col-sm-push-2{left:16.666667%}.col-sm-push-3{left:25%}.col-sm-push-4{left:33.333333%}.col-sm-push-5{left:41.666667%}.col-sm-push-6{left:50%}.col-sm-push-7{left:58.333333%}.col-sm-push-8{left:66.666667%}.col-sm-push-9{left:75%}.col-sm-push-10{left:83.333333%}.col-sm-push-11{left:91.666667%}.col-sm-push-12{left:100%}.col-sm-offset-0{margin-left:0}.col-sm-offset-1{margin-left:8.333333%}.col-sm-offset-2{margin-left:16.666667%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-4{margin-left:33.333333%}.col-sm-offset-5{margin-left:41.666667%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-7{margin-left:58.333333%}.col-sm-offset-8{margin-left:66.666667%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-10{margin-left:83.333333%}.col-sm-offset-11{margin-left:91.666667%}.col-sm-offset-12{margin-left:100%}}@media (min-width:768px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-1{width:8.333333%}.col-md-2{width:16.666667%}.col-md-3{width:25%}.col-md-4{width:33.333333%}.col-md-5{width:41.666667%}.col-md-6{width:50%}.col-md-7{width:58.333333%}.col-md-8{width:66.666667%}.col-md-9{width:75%}.col-md-10{width:83.333333%}.col-md-11{width:91.666667%}.col-md-12{width:100%}.col-md-pull-0{right:auto}.col-md-pull-1{right:8.333333%}.col-md-pull-2{right:16.666667%}.col-md-pull-3{right:25%}.col-md-pull-4{right:33.333333%}.col-md-pull-5{right:41.666667%}.col-md-pull-6{right:50%}.col-md-pull-7{right:58.333333%}.col-md-pull-8{right:66.666667%}.col-md-pull-9{right:75%}.col-md-pull-10{right:83.333333%}.col-md-pull-11{right:91.666667%}.col-md-pull-12{right:100%}.col-md-push-0{left:auto}.col-md-push-1{left:8.333333%}.col-md-push-2{left:16.666667%}.col-md-push-3{left:25%}.col-md-push-4{left:33.333333%}.col-md-push-5{left:41.666667%}.col-md-push-6{left:50%}.col-md-push-7{left:58.333333%}.col-md-push-8{left:66.666667%}.col-md-push-9{left:75%}.col-md-push-10{left:83.333333%}.col-md-push-11{left:91.666667%}.col-md-push-12{left:100%}.col-md-offset-0{margin-left:0}.col-md-offset-1{margin-left:8.333333%}.col-md-offset-2{margin-left:16.666667%}.col-md-offset-3{margin-left:25%}.col-md-offset-4{margin-left:33.333333%}.col-md-offset-5{margin-left:41.666667%}.col-md-offset-6{margin-left:50%}.col-md-offset-7{margin-left:58.333333%}.col-md-offset-8{margin-left:66.666667%}.col-md-offset-9{margin-left:75%}.col-md-offset-10{margin-left:83.333333%}.col-md-offset-11{margin-left:91.666667%}.col-md-offset-12{margin-left:100%}}@media (min-width:992px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-1{width:8.333333%}.col-lg-2{width:16.666667%}.col-lg-3{width:25%}.col-lg-4{width:33.333333%}.col-lg-5{width:41.666667%}.col-lg-6{width:50%}.col-lg-7{width:58.333333%}.col-lg-8{width:66.666667%}.col-lg-9{width:75%}.col-lg-10{width:83.333333%}.col-lg-11{width:91.666667%}.col-lg-12{width:100%}.col-lg-pull-0{right:auto}.col-lg-pull-1{right:8.333333%}.col-lg-pull-2{right:16.666667%}.col-lg-pull-3{right:25%}.col-lg-pull-4{right:33.333333%}.col-lg-pull-5{right:41.666667%}.col-lg-pull-6{right:50%}.col-lg-pull-7{right:58.333333%}.col-lg-pull-8{right:66.666667%}.col-lg-pull-9{right:75%}.col-lg-pull-10{right:83.333333%}.col-lg-pull-11{right:91.666667%}.col-lg-pull-12{right:100%}.col-lg-push-0{left:auto}.col-lg-push-1{left:8.333333%}.col-lg-push-2{left:16.666667%}.col-lg-push-3{left:25%}.col-lg-push-4{left:33.333333%}.col-lg-push-5{left:41.666667%}.col-lg-push-6{left:50%}.col-lg-push-7{left:58.333333%}.col-lg-push-8{left:66.666667%}.col-lg-push-9{left:75%}.col-lg-push-10{left:83.333333%}.col-lg-push-11{left:91.666667%}.col-lg-push-12{left:100%}.col-lg-offset-0{margin-left:0}.col-lg-offset-1{margin-left:8.333333%}.col-lg-offset-2{margin-left:16.666667%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-4{margin-left:33.333333%}.col-lg-offset-5{margin-left:41.666667%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-7{margin-left:58.333333%}.col-lg-offset-8{margin-left:66.666667%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-10{margin-left:83.333333%}.col-lg-offset-11{margin-left:91.666667%}.col-lg-offset-12{margin-left:100%}}@media (min-width:1200px){.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9{float:left}.col-xl-1{width:8.333333%}.col-xl-2{width:16.666667%}.col-xl-3{width:25%}.col-xl-4{width:33.333333%}.col-xl-5{width:41.666667%}.col-xl-6{width:50%}.col-xl-7{width:58.333333%}.col-xl-8{width:66.666667%}.col-xl-9{width:75%}.col-xl-10{width:83.333333%}.col-xl-11{width:91.666667%}.col-xl-12{width:100%}.col-xl-pull-0{right:auto}.col-xl-pull-1{right:8.333333%}.col-xl-pull-2{right:16.666667%}.col-xl-pull-3{right:25%}.col-xl-pull-4{right:33.333333%}.col-xl-pull-5{right:41.666667%}.col-xl-pull-6{right:50%}.col-xl-pull-7{right:58.333333%}.col-xl-pull-8{right:66.666667%}.col-xl-pull-9{right:75%}.col-xl-pull-10{right:83.333333%}.col-xl-pull-11{right:91.666667%}.col-xl-pull-12{right:100%}.col-xl-push-0{left:auto}.col-xl-push-1{left:8.333333%}.col-xl-push-2{left:16.666667%}.col-xl-push-3{left:25%}.col-xl-push-4{left:33.333333%}.col-xl-push-5{left:41.666667%}.col-xl-push-6{left:50%}.col-xl-push-7{left:58.333333%}.col-xl-push-8{left:66.666667%}.col-xl-push-9{left:75%}.col-xl-push-10{left:83.333333%}.col-xl-push-11{left:91.666667%}.col-xl-push-12{left:100%}.col-xl-offset-0{margin-left:0}.col-xl-offset-1{margin-left:8.333333%}.col-xl-offset-2{margin-left:16.666667%}.col-xl-offset-3{margin-left:25%}.col-xl-offset-4{margin-left:33.333333%}.col-xl-offset-5{margin-left:41.666667%}.col-xl-offset-6{margin-left:50%}.col-xl-offset-7{margin-left:58.333333%}.col-xl-offset-8{margin-left:66.666667%}.col-xl-offset-9{margin-left:75%}.col-xl-offset-10{margin-left:83.333333%}.col-xl-offset-11{margin-left:91.666667%}.col-xl-offset-12{margin-left:100%}}.table{width:100%;max-width:100%;margin-bottom:1rem}.table td,.table th{padding:.75rem;line-height:1.5;vertical-align:top;border-top:1px solid #eceeef}.table thead th{vertical-align:bottom;border-bottom:2px solid #eceeef}.table tbody+tbody{border-top:2px solid #eceeef}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #eceeef}.table-bordered td,.table-bordered th{border:1px solid #eceeef}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-striped tbody tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover tbody tr:hover{background-color:#f5f5f5}.table-active,.table-active>td,.table-active>th{background-color:#f5f5f5}.table-hover .table-active:hover{background-color:#e8e8e8}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:#e8e8e8}.table-success,.table-success>td,.table-success>th{background-color:#dff0d8}.table-hover .table-success:hover{background-color:#d0e9c6}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#d0e9c6}.table-info,.table-info>td,.table-info>th{background-color:#d9edf7}.table-hover .table-info:hover{background-color:#c4e3f3}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#c4e3f3}.table-warning,.table-warning>td,.table-warning>th{background-color:#fcf8e3}.table-hover .table-warning:hover{background-color:#faf2cc}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#faf2cc}.table-danger,.table-danger>td,.table-danger>th{background-color:#f2dede}.table-hover .table-danger:hover{background-color:#ebcccc}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#ebcccc}.table-responsive{display:block;width:100%;min-height:.01%;overflow-x:auto}.thead-inverse th{color:#fff;background-color:#373a3c}.thead-default th{color:#55595c;background-color:#eceeef}.table-inverse{color:#eceeef;background-color:#373a3c}.table-inverse.table-bordered{border:0}.table-inverse td,.table-inverse th,.table-inverse thead th{border-color:#55595c}.table-reflow thead{float:left}.table-reflow tbody{display:block;white-space:nowrap}.table-reflow td,.table-reflow th{border-top:1px solid #eceeef;border-left:1px solid #eceeef}.table-reflow td:last-child,.table-reflow th:last-child{border-right:1px solid #eceeef}.table-reflow tbody:last-child tr:last-child td,.table-reflow tbody:last-child tr:last-child th,.table-reflow tfoot:last-child tr:last-child td,.table-reflow tfoot:last-child tr:last-child th,.table-reflow thead:last-child tr:last-child td,.table-reflow thead:last-child tr:last-child th{border-bottom:1px solid #eceeef}.table-reflow tr{float:left}.table-reflow tr td,.table-reflow tr th{display:block!important;border:1px solid #eceeef}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;line-height:1.5;color:#55595c;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:.25rem}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{border-color:#66afe9;outline:0}.form-control::-webkit-input-placeholder{color:#999;opacity:1}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999;opacity:1}.form-control::placeholder{color:#999;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#eceeef;opacity:1}.form-control:disabled{cursor:not-allowed}.form-control-file,.form-control-range{display:block}.form-control-label{padding:.375rem .75rem;margin-bottom:0}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:2.25rem}.input-group-sm input[type=date].form-control,.input-group-sm input[type=time].form-control,.input-group-sm input[type=datetime-local].form-control,.input-group-sm input[type=month].form-control,input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:1.8625rem}.input-group-lg input[type=date].form-control,.input-group-lg input[type=time].form-control,.input-group-lg input[type=datetime-local].form-control,.input-group-lg input[type=month].form-control,input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:3.166667rem}}.form-control-static{min-height:2.25rem;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0}.form-control-static.form-control-lg,.form-control-static.form-control-sm,.input-group-lg>.form-control-static.form-control,.input-group-lg>.form-control-static.input-group-addon,.input-group-lg>.input-group-btn>.form-control-static.btn,.input-group-sm>.form-control-static.form-control,.input-group-sm>.form-control-static.input-group-addon,.input-group-sm>.input-group-btn>.form-control-static.btn{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{padding:.275rem .75rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{padding:.75rem 1.25rem;font-size:1.25rem;line-height:1.333333;border-radius:.3rem}.form-group{margin-bottom:1rem}.checkbox,.radio{position:relative;display:block;margin-bottom:.75rem}.checkbox label,.radio label{padding-left:1.25rem;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox label input:only-child,.radio label input:only-child{position:static}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:.25rem;margin-left:-1.25rem}.checkbox+.checkbox,.radio+.radio{margin-top:-.25rem}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:1.25rem;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:.75rem}input[type=checkbox].disabled,input[type=checkbox]:disabled,input[type=radio].disabled,input[type=radio]:disabled{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label{cursor:not-allowed}.form-control-danger,.form-control-success,.form-control-warning{padding-right:2.25rem;background-repeat:no-repeat;background-position:center right .5625rem;-webkit-background-size:1.4625rem 1.4625rem;background-size:1.4625rem 1.4625rem}.has-success .checkbox,.has-success .checkbox-inline,.has-success .form-control-label,.has-success .radio,.has-success .radio-inline,.has-success .text-help,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#5cb85c}.has-success .form-control{border-color:#5cb85c}.has-success .input-group-addon{color:#5cb85c;background-color:#eaf6ea;border-color:#5cb85c}.has-success .form-control-feedback{color:#5cb85c}.has-success .form-control-success{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2MTIgNzkyIj48cGF0aCBmaWxsPSIjNWNiODVjIiBkPSJNMjMzLjggNjEwYy0xMy4zIDAtMjYtNi0zNC0xNi44TDkwLjUgNDQ4LjhDNzYuMyA0MzAgODAgNDAzLjMgOTguOCAzODljMTguOC0xNC4yIDQ1LjUtMTAuNCA1OS44IDguNGw3MiA5NUw0NTEuMyAyNDJjMTIuNS0yMCAzOC44LTI2LjIgNTguOC0xMy43IDIwIDEyLjQgMjYgMzguNyAxMy43IDU4LjhMMjcwIDU5MGMtNy40IDEyLTIwLjIgMTkuNC0zNC4zIDIwaC0yeiIvPjwvc3ZnPg==)}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .form-control-label,.has-warning .radio,.has-warning .radio-inline,.has-warning .text-help,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#f0ad4e}.has-warning .form-control{border-color:#f0ad4e}.has-warning .input-group-addon{color:#f0ad4e;background-color:#fff;border-color:#f0ad4e}.has-warning .form-control-feedback{color:#f0ad4e}.has-warning .form-control-warning{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2MTIgNzkyIj48cGF0aCBmaWxsPSIjZjBhZDRlIiBkPSJNNjAzIDY0MC4ybC0yNzguNS01MDljLTMuOC02LjYtMTAuOC0xMC42LTE4LjUtMTAuNnMtMTQuNyA0LTE4LjUgMTAuNkw5IDY0MC4yYy0zLjcgNi41LTMuNiAxNC40LjIgMjAuOCAzLjggNi41IDEwLjggMTAuNCAxOC4zIDEwLjRoNTU3YzcuNiAwIDE0LjYtNCAxOC40LTEwLjQgMy41LTYuNCAzLjYtMTQuNCAwLTIwLjh6bS0yNjYuNC0zMGgtNjEuMlY1NDloNjEuMnY2MS4yem0wLTEwN2gtNjEuMlYzMDRoNjEuMnYxOTl6Ii8+PC9zdmc+)}.has-danger .checkbox,.has-danger .checkbox-inline,.has-danger .form-control-label,.has-danger .radio,.has-danger .radio-inline,.has-danger .text-help,.has-danger.checkbox label,.has-danger.checkbox-inline label,.has-danger.radio label,.has-danger.radio-inline label{color:#d9534f}.has-danger .form-control{border-color:#d9534f}.has-danger .input-group-addon{color:#d9534f;background-color:#fdf7f7;border-color:#d9534f}.has-danger .form-control-feedback{color:#d9534f}.has-danger .form-control-danger{background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2MTIgNzkyIj48cGF0aCBmaWxsPSIjZDk1MzRmIiBkPSJNNDQ3IDU0NC40Yy0xNC40IDE0LjQtMzcuNiAxNC40LTUyIDBsLTg5LTkyLjctODkgOTIuN2MtMTQuNSAxNC40LTM3LjcgMTQuNC01MiAwLTE0LjQtMTQuNC0xNC40LTM3LjYgMC01Mmw5Mi40LTk2LjMtOTIuNC05Ni4zYy0xNC40LTE0LjQtMTQuNC0zNy42IDAtNTJzMzcuNi0xNC4zIDUyIDBsODkgOTIuOCA4OS4yLTkyLjdjMTQuNC0xNC40IDM3LjYtMTQuNCA1MiAwIDE0LjMgMTQuNCAxNC4zIDM3LjYgMCA1MkwzNTQuNiAzOTZsOTIuNCA5Ni40YzE0LjQgMTQuNCAxNC40IDM3LjYgMCA1MnoiLz48L3N2Zz4=)}@media (min-width:544px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .form-control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.btn{display:inline-block;padding:.375rem 1rem;font-size:1rem;font-weight:400;line-height:1.5;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;border-radius:.25rem}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:focus,.btn:hover{text-decoration:none}.btn.focus{text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0}.btn.disabled,.btn:disabled{cursor:not-allowed;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#0275d8;border-color:#0275d8}.btn-primary:hover{color:#fff;background-color:#025aa5;border-color:#01549b}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#025aa5;border-color:#01549b}.btn-primary.active,.btn-primary:active,.open>.btn-primary.dropdown-toggle{color:#fff;background-color:#025aa5;background-image:none;border-color:#01549b}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.btn-primary.dropdown-toggle.focus,.open>.btn-primary.dropdown-toggle:focus,.open>.btn-primary.dropdown-toggle:hover{color:#fff;background-color:#014682;border-color:#01315a}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary:disabled.focus,.btn-primary:disabled:focus{background-color:#0275d8;border-color:#0275d8}.btn-primary.disabled:hover,.btn-primary:disabled:hover{background-color:#0275d8;border-color:#0275d8}.btn-secondary{color:#373a3c;background-color:#fff;border-color:#ccc}.btn-secondary:hover{color:#373a3c;background-color:#e6e6e6;border-color:#adadad}.btn-secondary.focus,.btn-secondary:focus{color:#373a3c;background-color:#e6e6e6;border-color:#adadad}.btn-secondary.active,.btn-secondary:active,.open>.btn-secondary.dropdown-toggle{color:#373a3c;background-color:#e6e6e6;background-image:none;border-color:#adadad}.btn-secondary.active.focus,.btn-secondary.active:focus,.btn-secondary.active:hover,.btn-secondary:active.focus,.btn-secondary:active:focus,.btn-secondary:active:hover,.open>.btn-secondary.dropdown-toggle.focus,.open>.btn-secondary.dropdown-toggle:focus,.open>.btn-secondary.dropdown-toggle:hover{color:#373a3c;background-color:#d4d4d4;border-color:#8c8c8c}.btn-secondary.disabled.focus,.btn-secondary.disabled:focus,.btn-secondary:disabled.focus,.btn-secondary:disabled:focus{background-color:#fff;border-color:#ccc}.btn-secondary.disabled:hover,.btn-secondary:disabled:hover{background-color:#fff;border-color:#ccc}.btn-info{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#2aabd2}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#2aabd2}.btn-info.active,.btn-info:active,.open>.btn-info.dropdown-toggle{color:#fff;background-color:#31b0d5;background-image:none;border-color:#2aabd2}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.btn-info.dropdown-toggle.focus,.open>.btn-info.dropdown-toggle:focus,.open>.btn-info.dropdown-toggle:hover{color:#fff;background-color:#269abc;border-color:#1f7e9a}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info:disabled.focus,.btn-info:disabled:focus{background-color:#5bc0de;border-color:#5bc0de}.btn-info.disabled:hover,.btn-info:disabled:hover{background-color:#5bc0de;border-color:#5bc0de}.btn-success{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#419641}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#419641}.btn-success.active,.btn-success:active,.open>.btn-success.dropdown-toggle{color:#fff;background-color:#449d44;background-image:none;border-color:#419641}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.btn-success.dropdown-toggle.focus,.open>.btn-success.dropdown-toggle:focus,.open>.btn-success.dropdown-toggle:hover{color:#fff;background-color:#398439;border-color:#2d672d}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success:disabled.focus,.btn-success:disabled:focus{background-color:#5cb85c;border-color:#5cb85c}.btn-success.disabled:hover,.btn-success:disabled:hover{background-color:#5cb85c;border-color:#5cb85c}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#eb9316}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#eb9316}.btn-warning.active,.btn-warning:active,.open>.btn-warning.dropdown-toggle{color:#fff;background-color:#ec971f;background-image:none;border-color:#eb9316}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.btn-warning.dropdown-toggle.focus,.open>.btn-warning.dropdown-toggle:focus,.open>.btn-warning.dropdown-toggle:hover{color:#fff;background-color:#d58512;border-color:#b06d0f}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning:disabled.focus,.btn-warning:disabled:focus{background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning.disabled:hover,.btn-warning:disabled:hover{background-color:#f0ad4e;border-color:#f0ad4e}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d9534f}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#c12e2a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#c12e2a}.btn-danger.active,.btn-danger:active,.open>.btn-danger.dropdown-toggle{color:#fff;background-color:#c9302c;background-image:none;border-color:#c12e2a}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.btn-danger.dropdown-toggle.focus,.open>.btn-danger.dropdown-toggle:focus,.open>.btn-danger.dropdown-toggle:hover{color:#fff;background-color:#ac2925;border-color:#8b211e}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger:disabled.focus,.btn-danger:disabled:focus{background-color:#d9534f;border-color:#d9534f}.btn-danger.disabled:hover,.btn-danger:disabled:hover{background-color:#d9534f;border-color:#d9534f}.btn-primary-outline{color:#0275d8;background-color:transparent;background-image:none;border-color:#0275d8}.btn-primary-outline.active,.btn-primary-outline.focus,.btn-primary-outline:active,.btn-primary-outline:focus,.open>.btn-primary-outline.dropdown-toggle{color:#fff;background-color:#0275d8;border-color:#0275d8}.btn-primary-outline:hover{color:#fff;background-color:#0275d8;border-color:#0275d8}.btn-primary-outline.disabled.focus,.btn-primary-outline.disabled:focus,.btn-primary-outline:disabled.focus,.btn-primary-outline:disabled:focus{border-color:#43a7fd}.btn-primary-outline.disabled:hover,.btn-primary-outline:disabled:hover{border-color:#43a7fd}.btn-secondary-outline{color:#ccc;background-color:transparent;background-image:none;border-color:#ccc}.btn-secondary-outline.active,.btn-secondary-outline.focus,.btn-secondary-outline:active,.btn-secondary-outline:focus,.open>.btn-secondary-outline.dropdown-toggle{color:#fff;background-color:#ccc;border-color:#ccc}.btn-secondary-outline:hover{color:#fff;background-color:#ccc;border-color:#ccc}.btn-secondary-outline.disabled.focus,.btn-secondary-outline.disabled:focus,.btn-secondary-outline:disabled.focus,.btn-secondary-outline:disabled:focus{border-color:#fff}.btn-secondary-outline.disabled:hover,.btn-secondary-outline:disabled:hover{border-color:#fff}.btn-info-outline{color:#5bc0de;background-color:transparent;background-image:none;border-color:#5bc0de}.btn-info-outline.active,.btn-info-outline.focus,.btn-info-outline:active,.btn-info-outline:focus,.open>.btn-info-outline.dropdown-toggle{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-info-outline:hover{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.btn-info-outline.disabled.focus,.btn-info-outline.disabled:focus,.btn-info-outline:disabled.focus,.btn-info-outline:disabled:focus{border-color:#b0e1ef}.btn-info-outline.disabled:hover,.btn-info-outline:disabled:hover{border-color:#b0e1ef}.btn-success-outline{color:#5cb85c;background-color:transparent;background-image:none;border-color:#5cb85c}.btn-success-outline.active,.btn-success-outline.focus,.btn-success-outline:active,.btn-success-outline:focus,.open>.btn-success-outline.dropdown-toggle{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-success-outline:hover{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.btn-success-outline.disabled.focus,.btn-success-outline.disabled:focus,.btn-success-outline:disabled.focus,.btn-success-outline:disabled:focus{border-color:#a3d7a3}.btn-success-outline.disabled:hover,.btn-success-outline:disabled:hover{border-color:#a3d7a3}.btn-warning-outline{color:#f0ad4e;background-color:transparent;background-image:none;border-color:#f0ad4e}.btn-warning-outline.active,.btn-warning-outline.focus,.btn-warning-outline:active,.btn-warning-outline:focus,.open>.btn-warning-outline.dropdown-toggle{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning-outline:hover{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.btn-warning-outline.disabled.focus,.btn-warning-outline.disabled:focus,.btn-warning-outline:disabled.focus,.btn-warning-outline:disabled:focus{border-color:#f8d9ac}.btn-warning-outline.disabled:hover,.btn-warning-outline:disabled:hover{border-color:#f8d9ac}.btn-danger-outline{color:#d9534f;background-color:transparent;background-image:none;border-color:#d9534f}.btn-danger-outline.active,.btn-danger-outline.focus,.btn-danger-outline:active,.btn-danger-outline:focus,.open>.btn-danger-outline.dropdown-toggle{color:#fff;background-color:#d9534f;border-color:#d9534f}.btn-danger-outline:hover{color:#fff;background-color:#d9534f;border-color:#d9534f}.btn-danger-outline.disabled.focus,.btn-danger-outline.disabled:focus,.btn-danger-outline:disabled.focus,.btn-danger-outline:disabled:focus{border-color:#eba5a3}.btn-danger-outline.disabled:hover,.btn-danger-outline:disabled:hover{border-color:#eba5a3}.btn-link{font-weight:400;color:#0275d8;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link:disabled{background-color:transparent}.btn-link,.btn-link:active,.btn-link:focus{border-color:transparent}.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#014c8c;text-decoration:underline;background-color:transparent}.btn-link:disabled:focus,.btn-link:disabled:hover{color:#818a91;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:.75rem 1.25rem;font-size:1.25rem;line-height:1.333333;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .75rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height;-o-transition-property:height;transition-property:height}.dropdown,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-right:.25rem;margin-left:.25rem;vertical-align:middle;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-left:.3em solid transparent}.dropdown-toggle:focus{outline:0}.dropup .dropdown-toggle::after{border-top:0;border-bottom:.3em solid}.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;font-size:1rem;color:#373a3c;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-divider{height:1px;margin:.5rem 0;overflow:hidden;background-color:#e5e5e5}.dropdown-item{display:block;width:100%;padding:3px 20px;clear:both;font-weight:400;line-height:1.5;color:#373a3c;text-align:inherit;white-space:nowrap;background:0 0;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#2b2d2f;text-decoration:none;background-color:#f5f5f5}.dropdown-item.active,.dropdown-item.active:focus,.dropdown-item.active:hover{color:#fff;text-decoration:none;background-color:#0275d8;outline:0}.dropdown-item.disabled,.dropdown-item.disabled:focus,.dropdown-item.disabled:hover{color:#818a91}.dropdown-item.disabled:focus,.dropdown-item.disabled:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:"progid:DXImageTransform.Microsoft.gradient(enabled = false)"}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:.875rem;line-height:1.5;color:#818a91;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:.3em solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:2}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar::after{display:table;clear:both;content:""}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group-lg.btn-group>.btn+.dropdown-toggle,.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn .caret{margin-left:0}.btn-group-lg>.btn .caret,.btn-lg .caret{border-width:.3em .3em 0;border-bottom-width:0}.dropup .btn-group-lg>.btn .caret,.dropup .btn-lg .caret{border-width:0 .3em .3em}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group::after{display:table;clear:both;content:""}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:.25rem;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:.25rem}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:active,.input-group .form-control:focus,.input-group .form-control:hover{z-index:3}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1;color:#55595c;text-align:center;background-color:#eceeef;border:1px solid #ccc;border-radius:.25rem}.input-group-addon.form-control-sm,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.input-group-addon.btn{padding:.275rem .75rem;font-size:.875rem;border-radius:.2rem}.input-group-addon.form-control-lg,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.input-group-addon.btn{padding:.75rem 1.25rem;font-size:1.25rem;border-radius:.3rem}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:3}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.input-group-btn:last-child>.btn-group:active,.input-group-btn:last-child>.btn-group:focus,.input-group-btn:last-child>.btn-group:hover,.input-group-btn:last-child>.btn:active,.input-group-btn:last-child>.btn:focus,.input-group-btn:last-child>.btn:hover{z-index:3}.c-input{position:relative;display:inline;padding-left:1.5rem;color:#555;cursor:pointer}.c-input>input{position:absolute;z-index:-1;opacity:0}.c-input>input:checked~.c-indicator{color:#fff;background-color:#0074d9}.c-input>input:focus~.c-indicator{-webkit-box-shadow:0 0 0 .075rem #fff,0 0 0 .2rem #0074d9;box-shadow:0 0 0 .075rem #fff,0 0 0 .2rem #0074d9}.c-input>input:active~.c-indicator{color:#fff;background-color:#84c6ff}.c-input+.c-input{margin-left:1rem}.c-indicator{position:absolute;top:0;left:0;display:block;width:1rem;height:1rem;font-size:65%;line-height:1rem;color:#eee;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#eee;background-repeat:no-repeat;background-position:center center;-webkit-background-size:50% 50%;background-size:50% 50%}.c-checkbox .c-indicator{border-radius:.25rem}.c-checkbox input:checked~.c-indicator{background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNy4xLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgOCA4IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA4IDgiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHBhdGggZmlsbD0iI0ZGRkZGRiIgZD0iTTYuNCwxTDUuNywxLjdMMi45LDQuNUwyLjEsMy43TDEuNCwzTDAsNC40bDAuNywwLjdsMS41LDEuNWwwLjcsMC43bDAuNy0wLjdsMy41LTMuNWwwLjctMC43TDYuNCwxTDYuNCwxeiINCgkvPg0KPC9zdmc+DQo=)}.c-checkbox input:indeterminate~.c-indicator{background-color:#0074d9;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNy4xLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iOHB4IiBoZWlnaHQ9IjhweCIgdmlld0JveD0iMCAwIDggOCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgOCA4IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxwYXRoIGZpbGw9IiNGRkZGRkYiIGQ9Ik0wLDN2Mmg4VjNIMHoiLz4NCjwvc3ZnPg0K)}.c-radio .c-indicator{border-radius:50%}.c-radio input:checked~.c-indicator{background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNy4xLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgOCA4IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA4IDgiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHBhdGggZmlsbD0iI0ZGRkZGRiIgZD0iTTQsMUMyLjMsMSwxLDIuMywxLDRzMS4zLDMsMywzczMtMS4zLDMtM1M1LjcsMSw0LDF6Ii8+DQo8L3N2Zz4NCg==)}.c-inputs-stacked .c-input{display:inline}.c-inputs-stacked .c-input::after{display:block;margin-bottom:.25rem;content:""}.c-inputs-stacked .c-input+.c-input{margin-left:0}.c-select{display:inline-block;max-width:100%;-webkit-appearance:none;padding:.375rem 1.75rem .375rem .75rem;padding-right:.75rem\9;color:#55595c;vertical-align:middle;background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAUCAMAAACzvE1FAAAADFBMVEUzMzMzMzMzMzMzMzMKAG/3AAAAA3RSTlMAf4C/aSLHAAAAPElEQVR42q3NMQ4AIAgEQTn//2cLdRKppSGzBYwzVXvznNWs8C58CiussPJj8h6NwgorrKRdTvuV9v16Afn0AYFOB7aYAAAAAElFTkSuQmCC) no-repeat right .75rem center;background-image:none\9;-webkit-background-size:8px 10px;background-size:8px 10px;border:1px solid #ccc;-moz-appearance:none}.c-select:focus{border-color:#51a7e8;outline:0}.c-select::-ms-expand{opacity:0}.c-select-sm{padding-top:3px;padding-bottom:3px;font-size:12px}.c-select-sm:not([multiple]){height:26px;min-height:26px}.file{position:relative;display:inline-block;height:2.5rem;cursor:pointer}.file input{min-width:14rem;margin:0;filter:alpha(opacity=0);opacity:0}.file-custom{position:absolute;top:0;right:0;left:0;z-index:5;height:2.5rem;padding:.5rem 1rem;line-height:1.5;color:#555;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff;border:1px solid #ddd;border-radius:.25rem}.file-custom::after{content:"Choose file..."}.file-custom::before{position:absolute;top:-.075rem;right:-.075rem;bottom:-.075rem;z-index:6;display:block;height:2.5rem;padding:.5rem 1rem;line-height:1.5;color:#555;content:"Browse";background-color:#eee;border:1px solid #ddd;border-radius:0 .25rem .25rem 0}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:inline-block}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#818a91}.nav-link.disabled,.nav-link.disabled:focus,.nav-link.disabled:hover{color:#818a91;cursor:not-allowed;background-color:transparent}.nav-inline .nav-item{display:inline-block}.nav-inline .nav-item+.nav-item,.nav-inline .nav-link+.nav-link{margin-left:1rem}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs::after{display:table;clear:both;content:""}.nav-tabs .nav-item{float:left;margin-bottom:-1px}.nav-tabs .nav-item+.nav-item{margin-left:.2rem}.nav-tabs .nav-link{display:block;padding:.5em 1em;border:1px solid transparent;border-radius:.25rem .25rem 0 0}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#eceeef #eceeef #ddd}.nav-tabs .nav-link.disabled,.nav-tabs .nav-link.disabled:focus,.nav-tabs .nav-link.disabled:hover{color:#818a91;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.open .nav-link,.nav-tabs .nav-item.open .nav-link:focus,.nav-tabs .nav-item.open .nav-link:hover,.nav-tabs .nav-link.active,.nav-tabs .nav-link.active:focus,.nav-tabs .nav-link.active:hover{color:#55595c;background-color:#fff;border-color:#ddd #ddd transparent}.nav-pills::after{display:table;clear:both;content:""}.nav-pills .nav-item{float:left}.nav-pills .nav-item+.nav-item{margin-left:.2rem}.nav-pills .nav-link{display:block;padding:.5em 1em;border-radius:.25rem}.nav-pills .nav-item.open .nav-link,.nav-pills .nav-item.open .nav-link:focus,.nav-pills .nav-item.open .nav-link:hover,.nav-pills .nav-link.active,.nav-pills .nav-link.active:focus,.nav-pills .nav-link.active:hover{color:#fff;cursor:default;background-color:#0275d8}.nav-stacked .nav-item{display:block;float:none}.nav-stacked .nav-item+.nav-item{margin-top:.2rem;margin-left:0}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;padding:.5rem 1rem}.navbar::after{display:table;clear:both;content:""}@media (min-width:544px){.navbar{border-radius:.25rem}}.navbar-full{z-index:1000}@media (min-width:544px){.navbar-full{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:544px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0}.navbar-fixed-bottom{bottom:0}.navbar-sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1030;width:100%}@media (min-width:544px){.navbar-sticky-top{border-radius:0}}.navbar-brand{float:left;padding-top:.25rem;padding-bottom:.25rem;margin-right:1rem;font-size:1.25rem}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}.navbar-divider{float:left;width:1px;padding-top:.425rem;padding-bottom:.425rem;margin-right:1rem;margin-left:1rem;overflow:hidden}.navbar-divider::before{content:"\00a0"}.navbar-toggler{padding:.5rem .75rem;font-size:1.25rem;line-height:1;background:0 0;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}@media (min-width:544px){.navbar-toggleable-xs{display:block!important}}@media (min-width:768px){.navbar-toggleable-sm{display:block!important}}@media (min-width:992px){.navbar-toggleable-md{display:block!important}}.navbar-nav .nav-item{float:left}.navbar-nav .nav-link{display:block;padding-top:.425rem;padding-bottom:.425rem}.navbar-nav .nav-link+.nav-link{margin-left:1rem}.navbar-nav .nav-item+.nav-item{margin-left:1rem}.navbar-light .navbar-brand{color:rgba(0,0,0,.8)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.8)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.6)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .active>.nav-link:focus,.navbar-light .navbar-nav .active>.nav-link:hover,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.active:focus,.navbar-light .navbar-nav .nav-link.active:hover,.navbar-light .navbar-nav .nav-link.open,.navbar-light .navbar-nav .nav-link.open:focus,.navbar-light .navbar-nav .nav-link.open:hover,.navbar-light .navbar-nav .open>.nav-link,.navbar-light .navbar-nav .open>.nav-link:focus,.navbar-light .navbar-nav .open>.nav-link:hover{color:rgba(0,0,0,.8)}.navbar-light .navbar-divider{background-color:rgba(0,0,0,.075)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .active>.nav-link:focus,.navbar-dark .navbar-nav .active>.nav-link:hover,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.active:focus,.navbar-dark .navbar-nav .nav-link.active:hover,.navbar-dark .navbar-nav .nav-link.open,.navbar-dark .navbar-nav .nav-link.open:focus,.navbar-dark .navbar-nav .nav-link.open:hover,.navbar-dark .navbar-nav .open>.nav-link,.navbar-dark .navbar-nav .open>.nav-link:focus,.navbar-dark .navbar-nav .open>.nav-link:hover{color:#fff}.navbar-dark .navbar-divider{background-color:rgba(255,255,255,.075)}.card{position:relative;display:block;margin-bottom:.75rem;background-color:#fff;border:1px solid #e5e5e5;border-radius:.25rem}.card-block{padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card>.list-group:first-child .list-group-item:first-child{border-radius:.25rem .25rem 0 0}.card>.list-group:last-child .list-group-item:last-child{border-radius:0 0 .25rem .25rem}.card-header{padding:.75rem 1.25rem;background-color:#f5f5f5;border-bottom:1px solid #e5e5e5}.card-header:first-child{border-radius:.25rem .25rem 0 0}.card-footer{padding:.75rem 1.25rem;background-color:#f5f5f5;border-top:1px solid #e5e5e5}.card-footer:last-child{border-radius:0 0 .25rem .25rem}.card-primary{background-color:#0275d8;border-color:#0275d8}.card-success{background-color:#5cb85c;border-color:#5cb85c}.card-info{background-color:#5bc0de;border-color:#5bc0de}.card-warning{background-color:#f0ad4e;border-color:#f0ad4e}.card-danger{background-color:#d9534f;border-color:#d9534f}.card-primary-outline{background-color:transparent;border-color:#0275d8}.card-secondary-outline{background-color:transparent;border-color:#ccc}.card-info-outline{background-color:transparent;border-color:#5bc0de}.card-success-outline{background-color:transparent;border-color:#5cb85c}.card-warning-outline{background-color:transparent;border-color:#f0ad4e}.card-danger-outline{background-color:transparent;border-color:#d9534f}.card-inverse .card-footer,.card-inverse .card-header{border-bottom:1px solid rgba(255,255,255,.2)}.card-inverse .card-blockquote,.card-inverse .card-footer,.card-inverse .card-header,.card-inverse .card-title{color:#fff}.card-inverse .card-blockquote>footer,.card-inverse .card-link,.card-inverse .card-text{color:rgba(255,255,255,.65)}.card-inverse .card-link:focus,.card-inverse .card-link:hover{color:#fff}.card-blockquote{padding:0;margin-bottom:0;border-left:0}.card-img{border-radius:.25rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img-top{border-radius:.25rem .25rem 0 0}.card-img-bottom{border-radius:0 0 .25rem .25rem}@media (min-width:544px){.card-deck{display:table;table-layout:fixed;border-spacing:1.25rem 0}.card-deck .card{display:table-cell;width:1%;vertical-align:top}.card-deck-wrapper{margin-right:-1.25rem;margin-left:-1.25rem}}@media (min-width:544px){.card-group{display:table;width:100%;table-layout:fixed}.card-group .card{display:table-cell;vertical-align:top}.card-group .card+.card{margin-left:0;border-left:0}.card-group .card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group .card:first-child .card-img-top{border-top-right-radius:0}.card-group .card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group .card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group .card:last-child .card-img-top{border-top-left-radius:0}.card-group .card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group .card:not(:first-child):not(:last-child){border-radius:0}.card-group .card:not(:first-child):not(:last-child) .card-img-bottom,.card-group .card:not(:first-child):not(:last-child) .card-img-top{border-radius:0}}@media (min-width:544px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem}.card-columns .card{display:inline-block;width:100%}}.breadcrumb{padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#eceeef;border-radius:.25rem}.breadcrumb::after{display:table;clear:both;content:""}.breadcrumb>li{float:left}.breadcrumb>li+li::before{padding-right:.5rem;padding-left:.5rem;color:#818a91;content:"/"}.breadcrumb>.active{color:#818a91}.pagination{display:inline-block;padding-left:0;margin-top:1rem;margin-bottom:1rem;border-radius:.25rem}.page-item{display:inline}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link,.page-item.active .page-link:focus,.page-item.active .page-link:hover{z-index:2;color:#fff;cursor:default;background-color:#0275d8;border-color:#0275d8}.page-item.disabled .page-link,.page-item.disabled .page-link:focus,.page-item.disabled .page-link:hover{color:#818a91;cursor:not-allowed;background-color:#fff;border-color:#ddd}.page-link{position:relative;float:left;padding:.5rem .75rem;margin-left:-1px;line-height:1.5;color:#0275d8;text-decoration:none;background-color:#fff;border:1px solid #ddd}.page-link:focus,.page-link:hover{color:#014c8c;background-color:#eceeef;border-color:#ddd}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.333333}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.275rem .75rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.pager{padding-left:0;margin-top:1rem;margin-bottom:1rem;text-align:center;list-style:none}.pager::after{display:table;clear:both;content:""}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eceeef}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover{color:#818a91;cursor:not-allowed;background-color:#fff}.pager .disabled>span{color:#818a91;cursor:not-allowed;background-color:#fff}.pager-next>a,.pager-next>span{float:right}.pager-prev>a,.pager-prev>span{float:left}.label{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.label:empty{display:none}.btn .label{position:relative;top:-1px}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.label-default{background-color:#818a91}.label-default[href]:focus,.label-default[href]:hover{background-color:#687077}.label-primary{background-color:#0275d8}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#025aa5}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#eceeef;border-radius:.3rem}@media (min-width:544px){.jumbotron{padding:4rem 2rem}}.jumbotron-hr{border-top-color:#d0d5d8}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{padding:15px;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:35px}.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d0e9c6}.alert-success hr{border-top-color:#c1e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bcdff1}.alert-info hr{border-top-color:#a6d5ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faf2cc}.alert-warning hr{border-top-color:#f7ecb5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebcccc}.alert-danger hr{border-top-color:#e4b9b9}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:block;width:100%;height:1rem;margin-bottom:1rem}.progress[value]{-webkit-appearance:none;color:#0074d9;border:0;-moz-appearance:none;appearance:none}.progress[value]::-webkit-progress-bar{background-color:#eee;border-radius:.25rem}.progress[value]::-webkit-progress-value::before{content:attr(value)}.progress[value]::-webkit-progress-value{background-color:#0074d9;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.progress[value="100"]::-webkit-progress-value{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}@media screen and (min-width:0\0){.progress{background-color:#eee;border-radius:.25rem}.progress-bar{display:inline-block;height:1rem;text-indent:-999rem;background-color:#0074d9;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.progress[width^="0"]{min-width:2rem;color:#818a91;background-color:transparent;background-image:none}.progress[width="100%"]{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}}.progress-striped[value]::-webkit-progress-value{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:1rem 1rem;background-size:1rem 1rem}.progress-striped[value]::-moz-progress-bar{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}@media screen and (min-width:0\0){.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:1rem 1rem;background-size:1rem 1rem}}.progress-animated[value]::-webkit-progress-value{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-animated[value]::-moz-progress-bar{animation:progress-bar-stripes 2s linear infinite}@media screen and (min-width:0\0){.progress-animated .progress-bar-striped{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}}.progress-success[value]::-webkit-progress-value{background-color:#5cb85c}.progress-success[value]::-moz-progress-bar{background-color:#5cb85c}@media screen and (min-width:0\0){.progress-success .progress-bar{background-color:#5cb85c}}.progress-info[value]::-webkit-progress-value{background-color:#5bc0de}.progress-info[value]::-moz-progress-bar{background-color:#5bc0de}@media screen and (min-width:0\0){.progress-info .progress-bar{background-color:#5bc0de}}.progress-warning[value]::-webkit-progress-value{background-color:#f0ad4e}.progress-warning[value]::-moz-progress-bar{background-color:#f0ad4e}@media screen and (min-width:0\0){.progress-warning .progress-bar{background-color:#f0ad4e}}.progress-danger[value]::-webkit-progress-value{background-color:#d9534f}.progress-danger[value]::-moz-progress-bar{background-color:#d9534f}@media screen and (min-width:0\0){.progress-danger .progress-bar{background-color:#d9534f}}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right{padding-left:10px}.media-left{padding-right:10px}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:0}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-flush .list-group-item{border-width:1px 0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}a.list-group-item,button.list-group-item{width:100%;color:#555;text-align:inherit}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#818a91;cursor:not-allowed;background-color:#eceeef}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#818a91}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#0275d8;border-color:#0275d8}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#a8d6fe}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9{padding-bottom:42.857143%}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.embed-responsive-1by1{padding-bottom:100%}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:transform .3s ease-out,-o-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out,-o-transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.in{opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header::after{display:table;clear:both;content:""}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.5}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer::after{display:table;clear:both;content:""}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:544px){.modal-dialog{width:600px;margin:30px auto}.modal-sm{width:300px}}@media (min-width:768px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:.875rem;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;opacity:0;line-break:auto}.tooltip.in{opacity:.9}.tooltip.bs-tether-element-attached-bottom,.tooltip.tooltip-top{padding:5px 0;margin-top:-3px}.tooltip.bs-tether-element-attached-bottom .tooltip-arrow,.tooltip.tooltip-top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.bs-tether-element-attached-left,.tooltip.tooltip-right{padding:0 5px;margin-left:3px}.tooltip.bs-tether-element-attached-left .tooltip-arrow,.tooltip.tooltip-right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.bs-tether-element-attached-top,.tooltip.tooltip-bottom{padding:5px 0;margin-top:3px}.tooltip.bs-tether-element-attached-top .tooltip-arrow,.tooltip.tooltip-bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bs-tether-element-attached-right,.tooltip.tooltip-left{padding:0 5px;margin-left:-3px}.tooltip.bs-tether-element-attached-right .tooltip-arrow,.tooltip.tooltip-left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:.875rem;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;line-break:auto}.popover.bs-tether-element-attached-bottom,.popover.popover-top{margin-top:-10px}.popover.bs-tether-element-attached-bottom .popover-arrow,.popover.popover-top .popover-arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.bs-tether-element-attached-bottom .popover-arrow::after,.popover.popover-top .popover-arrow::after{bottom:1px;margin-left:-10px;content:"";border-top-color:#fff;border-bottom-width:0}.popover.bs-tether-element-attached-left,.popover.popover-right{margin-left:10px}.popover.bs-tether-element-attached-left .popover-arrow,.popover.popover-right .popover-arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.bs-tether-element-attached-left .popover-arrow::after,.popover.popover-right .popover-arrow::after{bottom:-10px;left:1px;content:"";border-right-color:#fff;border-left-width:0}.popover.bs-tether-element-attached-top,.popover.popover-bottom{margin-top:10px}.popover.bs-tether-element-attached-top .popover-arrow,.popover.popover-bottom .popover-arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:rgba(0,0,0,.25)}.popover.bs-tether-element-attached-top .popover-arrow::after,.popover.popover-bottom .popover-arrow::after{top:1px;margin-left:-10px;content:"";border-top-width:0;border-bottom-color:#fff}.popover.bs-tether-element-attached-right,.popover.popover-left{margin-left:-10px}.popover.bs-tether-element-attached-right .popover-arrow,.popover.popover-left .popover-arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:rgba(0,0,0,.25)}.popover.bs-tether-element-attached-right .popover-arrow::after,.popover.popover-left .popover-arrow::after{right:1px;bottom:-10px;content:"";border-right-width:0;border-left-color:#fff}.popover-title{padding:8px 14px;margin:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:-.7rem -.7rem 0 0}.popover-content{padding:9px 14px}.popover-arrow,.popover-arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover-arrow{border-width:11px}.popover-arrow::after{content:"";border-width:10px}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.carousel-item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.carousel-item>a>img,.carousel-inner>.carousel-item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.carousel-item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:transform .6s ease-in-out,-o-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out,-o-transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.carousel-item.active.right,.carousel-inner>.carousel-item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.carousel-item.active.left,.carousel-inner>.carousel-item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.carousel-item.active,.carousel-inner>.carousel-item.next.left,.carousel-inner>.carousel-item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);opacity:.5}.carousel-control.left{background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;width:20px;height:20px;margin-top:-10px;font-family:serif;line-height:1}.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-prev::before{content:"\2039"}.carousel-control .icon-next::before{content:"\203a"}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:transparent;border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media (min-width:544px){.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .icon-prev{margin-left:-15px}.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix::after{display:table;clear:both;content:""}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-xs-left{float:left!important}.pull-xs-right{float:right!important}.pull-xs-none{float:none!important}@media (min-width:544px){.pull-sm-left{float:left!important}.pull-sm-right{float:right!important}.pull-sm-none{float:none!important}}@media (min-width:768px){.pull-md-left{float:left!important}.pull-md-right{float:right!important}.pull-md-none{float:none!important}}@media (min-width:992px){.pull-lg-left{float:left!important}.pull-lg-right{float:right!important}.pull-lg-none{float:none!important}}@media (min-width:1200px){.pull-xl-left{float:left!important}.pull-xl-right{float:right!important}.pull-xl-none{float:none!important}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.invisible{visibility:hidden!important}.text-hide{font:"0/0" a;color:transparent;text-shadow:none;background-color:transparent;border:0}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-xs-left{text-align:left!important}.text-xs-right{text-align:right!important}.text-xs-center{text-align:center!important}@media (min-width:544px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-normal{font-weight:400}.font-weight-bold{font-weight:700}.font-italic{font-style:italic}.text-muted{color:#818a91}.text-primary{color:#0275d8!important}a.text-primary:focus,a.text-primary:hover{color:#025aa5}.text-success{color:#5cb85c!important}a.text-success:focus,a.text-success:hover{color:#449d44}.text-info{color:#5bc0de!important}a.text-info:focus,a.text-info:hover{color:#31b0d5}.text-warning{color:#f0ad4e!important}a.text-warning:focus,a.text-warning:hover{color:#ec971f}.text-danger{color:#d9534f!important}a.text-danger:focus,a.text-danger:hover{color:#c9302c}.bg-inverse{color:#eceeef;background-color:#373a3c}.bg-faded{background-color:#f7f7f9}.bg-primary{color:#fff!important;background-color:#0275d8!important}a.bg-primary:focus,a.bg-primary:hover{background-color:#025aa5}.bg-success{color:#fff!important;background-color:#5cb85c!important}a.bg-success:focus,a.bg-success:hover{background-color:#449d44}.bg-info{color:#fff!important;background-color:#5bc0de!important}a.bg-info:focus,a.bg-info:hover{background-color:#31b0d5}.bg-warning{color:#fff!important;background-color:#f0ad4e!important}a.bg-warning:focus,a.bg-warning:hover{background-color:#ec971f}.bg-danger{color:#fff!important;background-color:#d9534f!important}a.bg-danger:focus,a.bg-danger:hover{background-color:#c9302c}.m-x-auto{margin-right:auto!important;margin-left:auto!important}.m-a-0{margin:0 0!important}.m-t-0{margin-top:0!important}.m-r-0{margin-right:0!important}.m-b-0{margin-bottom:0!important}.m-l-0{margin-left:0!important}.m-x-0{margin-right:0!important;margin-left:0!important}.m-y-0{margin-top:0!important;margin-bottom:0!important}.m-a-1{margin:1rem 1rem!important}.m-t-1{margin-top:1rem!important}.m-r-1{margin-right:1rem!important}.m-b-1{margin-bottom:1rem!important}.m-l-1{margin-left:1rem!important}.m-x-1{margin-right:1rem!important;margin-left:1rem!important}.m-y-1{margin-top:1rem!important;margin-bottom:1rem!important}.m-a-2{margin:1.5rem 1.5rem!important}.m-t-2{margin-top:1.5rem!important}.m-r-2{margin-right:1.5rem!important}.m-b-2{margin-bottom:1.5rem!important}.m-l-2{margin-left:1.5rem!important}.m-x-2{margin-right:1.5rem!important;margin-left:1.5rem!important}.m-y-2{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-a-3{margin:3rem 3rem!important}.m-t-3{margin-top:3rem!important}.m-r-3{margin-right:3rem!important}.m-b-3{margin-bottom:3rem!important}.m-l-3{margin-left:3rem!important}.m-x-3{margin-right:3rem!important;margin-left:3rem!important}.m-y-3{margin-top:3rem!important;margin-bottom:3rem!important}.p-a-0{padding:0 0!important}.p-t-0{padding-top:0!important}.p-r-0{padding-right:0!important}.p-b-0{padding-bottom:0!important}.p-l-0{padding-left:0!important}.p-x-0{padding-right:0!important;padding-left:0!important}.p-y-0{padding-top:0!important;padding-bottom:0!important}.p-a-1{padding:1rem 1rem!important}.p-t-1{padding-top:1rem!important}.p-r-1{padding-right:1rem!important}.p-b-1{padding-bottom:1rem!important}.p-l-1{padding-left:1rem!important}.p-x-1{padding-right:1rem!important;padding-left:1rem!important}.p-y-1{padding-top:1rem!important;padding-bottom:1rem!important}.p-a-2{padding:1.5rem 1.5rem!important}.p-t-2{padding-top:1.5rem!important}.p-r-2{padding-right:1.5rem!important}.p-b-2{padding-bottom:1.5rem!important}.p-l-2{padding-left:1.5rem!important}.p-x-2{padding-right:1.5rem!important;padding-left:1.5rem!important}.p-y-2{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-a-3{padding:3rem 3rem!important}.p-t-3{padding-top:3rem!important}.p-r-3{padding-right:3rem!important}.p-b-3{padding-bottom:3rem!important}.p-l-3{padding-left:3rem!important}.p-x-3{padding-right:3rem!important;padding-left:3rem!important}.p-y-3{padding-top:3rem!important;padding-bottom:3rem!important}.pos-f-t{position:fixed;top:0;right:0;left:0;z-index:1030}.hidden-xs-up{display:none!important}@media (max-width:543px){.hidden-xs-down{display:none!important}}@media (min-width:544px){.hidden-sm-up{display:none!important}}@media (max-width:767px){.hidden-sm-down{display:none!important}}@media (min-width:768px){.hidden-md-up{display:none!important}}@media (max-width:991px){.hidden-md-down{display:none!important}}@media (min-width:992px){.hidden-lg-up{display:none!important}}@media (max-width:1199px){.hidden-lg-down{display:none!important}}@media (min-width:1200px){.hidden-xl-up{display:none!important}}.hidden-xl-down{display:none!important}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} 6 | /*# sourceMappingURL=bootstrap.min.css.map */ --------------------------------------------------------------------------------