├── examples ├── 3_user_channels │ ├── css │ │ ├── .DS_Store │ │ └── bootstrap.min.css │ ├── index.php │ └── view.php ├── 4_drawings │ ├── save_image │ │ ├── test.png │ │ └── index.php │ ├── proxy.php │ ├── css │ │ └── style.css │ └── index.html ├── 1_document │ ├── permalink.php │ └── index.php └── 2_channelinchannel │ ├── view.php │ └── index.php ├── lib ├── config.php ├── User.php ├── ChannelCollection.php ├── Block.php ├── Request.php ├── Channel.php └── __.php ├── composer.json ├── arena.php └── README.md /examples/3_user_channels/css/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aredotna/arena-php/HEAD/examples/3_user_channels/css/.DS_Store -------------------------------------------------------------------------------- /examples/4_drawings/save_image/test.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aredotna/arena-php/HEAD/examples/4_drawings/save_image/test.png -------------------------------------------------------------------------------- /lib/config.php: -------------------------------------------------------------------------------- 1 | 10 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "arenahq/arena-php", 3 | "description": "PHP interface to the Arena API", 4 | "homepage": "https://github.com/arenahq/arena-php", 5 | "license": "MIT", 6 | "type": "library", 7 | 8 | "autoload": { 9 | "psr-4": {"": ""} 10 | } 11 | } -------------------------------------------------------------------------------- /lib/User.php: -------------------------------------------------------------------------------- 1 | $v) { 13 | $property = $k; 14 | $this->$property = $v; 15 | } 16 | 17 | } 18 | } 19 | 20 | 21 | 22 | ?> 23 | 24 | -------------------------------------------------------------------------------- /lib/ChannelCollection.php: -------------------------------------------------------------------------------- 1 | $v) { 13 | $property = $k; 14 | $this->$property = $v; 15 | } 16 | $this->set_channels(); 17 | } 18 | 19 | function each_channel($template) { 20 | __::each($this->channels, $template); 21 | } 22 | 23 | function set_channels(){ 24 | for($i = 0; $i < count($this->channels); $i++){ 25 | $this->channels[$i] = new Channel($this->channels[$i]); 26 | } 27 | } 28 | } 29 | 30 | 31 | 32 | ?> 33 | 34 | -------------------------------------------------------------------------------- /examples/4_drawings/proxy.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /examples/4_drawings/save_image/index.php: -------------------------------------------------------------------------------- 1 | create_block($slug, array('source' => $url)); 28 | $arena->select_block($block->connection_id); 29 | } 30 | ?> 31 | -------------------------------------------------------------------------------- /arena.php: -------------------------------------------------------------------------------- 1 | data); 23 | } 24 | 25 | function get_block($id = null){ 26 | $request = new Request("blocks/$id"); 27 | return new Block($request->data); 28 | } 29 | 30 | function get_user($slug = null){ 31 | $request = new Request("users/$slug"); 32 | return new User($request->data); 33 | } 34 | 35 | function get_user_channels($slug = null){ 36 | $request = new Request("users/$slug/channels"); 37 | return new ChannelCollection($request->data); 38 | } 39 | 40 | function create_block($channel_slug, $block_attrs = null){ 41 | $request = new Request("channels/$channel_slug/blocks", array('POST' => true), $block_attrs); 42 | return new Block($request->data); 43 | } 44 | 45 | function select_block($connection_id){ 46 | $request = new Request("connections/$connection_id/selection", array('PUT' => true)); 47 | } 48 | 49 | function set_page() { 50 | if(isset($_GET['page'])){ 51 | return $_GET['page']; 52 | }else{ 53 | return 1; 54 | } 55 | } 56 | 57 | } 58 | 59 | ?> -------------------------------------------------------------------------------- /lib/Block.php: -------------------------------------------------------------------------------- 1 | $v) { 11 | $property = $k; 12 | $this->$property = $v; 13 | } 14 | } 15 | 16 | function css_class() {return strtolower($this->class);} 17 | function base_css_class() {return strtolower($this->base_class);} 18 | function is_image() {return $this->class == "Image";} 19 | function is_text() {return $this->class == "Text";} 20 | function is_embed() {return $this->class == "Media";} 21 | function is_link() {return $this->class == "Link";} 22 | function is_attachment() {return $this->class == "Attachment";} 23 | function is_channel() {return $this->class == "Channel";} 24 | function image_url($type) {return $this->image[$type]['url'];} 25 | 26 | function relative_time() { 27 | $date = $this->connected_at; 28 | 29 | $diff = time() - strtotime($date); 30 | if ($diff<60) 31 | return $diff . " second" . $this->plural($diff) . " ago"; 32 | $diff = round($diff/60); 33 | if ($diff<60) 34 | return $diff . " minute" . $this->plural($diff) . " ago"; 35 | $diff = round($diff/60); 36 | if ($diff<24) 37 | return $diff . " hour" . $this->plural($diff) . " ago"; 38 | $diff = round($diff/24); 39 | if ($diff<7) 40 | return $diff . " day" . $this->plural($diff) . " ago"; 41 | $diff = round($diff/7); 42 | if ($diff<4) 43 | return $diff . " week" . $this->plural($diff) . " ago"; 44 | return "on " . date("F j, Y", strtotime($date)); 45 | } 46 | 47 | function plural($num) { 48 | if ($num != 1) 49 | return "s"; 50 | } 51 | } 52 | 53 | ?> -------------------------------------------------------------------------------- /examples/3_user_channels/index.php: -------------------------------------------------------------------------------- 1 | get_user($user_slug); 15 | $channels = $arena->get_user_channels($user_slug); 16 | 17 | ?> 18 | 19 | 20 | 21 | 22 | <?= $user->username; ?>'s Channels 23 | 24 | 25 | 30 | 31 | 32 |
33 |
34 |
35 | 41 |
42 |
43 | 44 |
45 |
46 |
47 | 48 | 59 | 60 | -------------------------------------------------------------------------------- /lib/Request.php: -------------------------------------------------------------------------------- 1 | set_url_params($options); 16 | 17 | $this->request = curl_init($url); 18 | curl_setopt($this->request, CURLOPT_RETURNTRANSFER, true); 19 | 20 | // set X-AUTH-TOKEN if defined 21 | if ($config['access_token'] !== ''){ 22 | curl_setopt($this->request, CURLOPT_HTTPHEADER, array('Authorization: Bearer '.$config['access_token'])); 23 | } 24 | 25 | // set POST data 26 | if(! empty($options['POST'])){ 27 | $params_string = http_build_query($params); 28 | curl_setopt($this->request, CURLOPT_POST, count($params)); 29 | curl_setopt($this->request, CURLOPT_POSTFIELDS, $params_string); 30 | } 31 | 32 | if(! empty($options['PUT'])){ 33 | if($params != null){ 34 | $params_string = http_build_query($params); 35 | curl_setopt($this->request, CURLOPT_POSTFIELDS, $params_string); 36 | } 37 | curl_setopt($this->request, CURLOPT_CUSTOMREQUEST, "PUT"); 38 | } 39 | 40 | $this->data = curl_exec($this->request); 41 | curl_close($this->request); 42 | 43 | if($this->data !== null){ 44 | $data = mb_convert_encoding($this->data, 'UTF-8', 'ASCII,UTF-8,ISO-8859-1'); 45 | $this->data = json_decode($data, true); 46 | return $this; 47 | } 48 | } 49 | 50 | function set_url_params ($options) { 51 | if($options !== null) { 52 | 53 | $str = "?"; 54 | $idx = 1; 55 | $options_length = count($options); 56 | 57 | foreach ($options as $key => $value) { 58 | $str .= "$key=$value"; 59 | if($idx !== $options_length){ 60 | $str .= "&"; 61 | $idx++; 62 | } 63 | } 64 | 65 | return $str; 66 | 67 | } 68 | } 69 | 70 | } 71 | 72 | ?> 73 | -------------------------------------------------------------------------------- /lib/Channel.php: -------------------------------------------------------------------------------- 1 | $v) { 14 | $property = $k; 15 | $this->$property = $v; 16 | } 17 | $this->set_blocks(); 18 | 19 | } 20 | 21 | function set_blocks() { 22 | if(isset($this->contents)){ 23 | for($i = 0; $i < count($this->contents); $i++){ 24 | $this->contents[$i] = new Block($this->contents[$i]); 25 | } 26 | } 27 | } 28 | 29 | function filter_unselected() { 30 | $this->contents = __::filter($this->contents, function($block){ return $block->selected === true; }); 31 | } 32 | 33 | function each_item($template) { 34 | __::each($this->contents, $template); 35 | } 36 | 37 | function each_page($current_page, $template) { 38 | if($this->total_pages > 1){ 39 | for ($i=1; $i < $this->total_pages; $i++) { 40 | call_user_func($template, $i, $current_page); 41 | } 42 | } 43 | } 44 | 45 | function authors_to_sentence() { 46 | if(count($this->collaborators)){ 47 | $str = $this->user['username']; 48 | $collaborators = $this->collaborators; 49 | $last_one = array_pop($collaborators); 50 | if(count($collaborators)){ 51 | foreach ($collaborators as $collaborator) { 52 | $str .= ", " . $collaborator['username']; 53 | } 54 | } 55 | $str .= " and " . $last_one['username']; 56 | return $str; 57 | }else{ 58 | return $this->user['username']; 59 | } 60 | } 61 | 62 | function set_sort_order($direction) { 63 | switch ($direction) { 64 | case 'asc': 65 | $this->contents = __::sortBy($this->contents, function($block) { return -strtotime($block->connected_at); }); 66 | break; 67 | case 'desc': 68 | $this->contents = __::sortBy($this->contents, function($block) { return strtotime($block->connected_at); }); 69 | break; 70 | case 'position': 71 | $this->contents = __::sortBy($this->contents, function($block) { return $block->position; }); 72 | break; 73 | } 74 | 75 | } 76 | } 77 | 78 | 79 | 80 | ?> 81 | 82 | -------------------------------------------------------------------------------- /examples/4_drawings/css/style.css: -------------------------------------------------------------------------------- 1 | * { 2 | -moz-box-sizing: border-box; 3 | -webkit-box-sizing: border-box; 4 | box-sizing: border-box; } 5 | 6 | .clearfix:after { 7 | visibility: hidden; 8 | display: block; 9 | font-size: 0; 10 | content: " "; 11 | clear: both; 12 | height: 0; } 13 | 14 | .clearfix { 15 | display: inline-block; } 16 | 17 | * html .clearfix { 18 | height: 1%; 19 | font-family: sans-serif; 20 | } 21 | 22 | .clearfix { 23 | display: block; } 24 | 25 | body { 26 | -moz-box-sizing: border-box; 27 | -webkit-box-sizing: border-box; 28 | box-sizing: border-box; 29 | padding: 0px; 30 | margin: 0px; 31 | font-family: sans-serif; 32 | } 33 | 34 | #wrapper { 35 | position: fixed; 36 | float: left; 37 | width: 100%; 38 | height: 100%; 39 | top: 0px; 40 | left: 0px; 41 | margin: 0px; 42 | padding: 0px 0px; 43 | background-color: white; 44 | overflow: scroll; 45 | } 46 | 47 | #right { 48 | position: fixed; 49 | left: 0px; 50 | top: 0px; 51 | width: 100%; 52 | height: 100%; 53 | overflow: scroll; 54 | z-index: 10; 55 | } 56 | 57 | #surface { 58 | -webkit-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.25); 59 | -moz-box-shadow: 0 1px 10px rgba(0, 0, 0, 0.25); 60 | box-shadow: 0 1px 10px rgba(0, 0, 0, 0.25); 61 | color: #5a5a5a; 62 | width: 100%; 63 | height: 100%; 64 | display: block; 65 | float: left; 66 | overflow: scroll; 67 | background-color: white; 68 | } 69 | #easel{ 70 | -moz-transition-property: background-color; /* FF4+ */ 71 | -moz-transition-duration: .8s; 72 | -webkit-transition-property: background-color; /* Saf3.2+, Chrome */ 73 | -webkit-transition-duration: .8s; 74 | -o-transition-property: background-color; /* Opera 10.5+ */ 75 | -o-transition-duration: .8s; 76 | -ms-transition-property: background-color; /* IE10? */ 77 | -ms-transition-duration: .8s; 78 | transition-property: background-color; /* Standard */ 79 | transition-duration: .8s; 80 | background-color:#fff; 81 | } 82 | #easel.success{background-color:#0f0;} 83 | #tools{ 84 | margin: 15px; 85 | } 86 | h1{ 87 | margin:15px; 88 | } 89 | h1 a{ 90 | text-decoration: none; 91 | color:#000; 92 | padding:4px; 93 | } 94 | a:hover{ 95 | text-decoration: underline; 96 | } -------------------------------------------------------------------------------- /examples/3_user_channels/view.php: -------------------------------------------------------------------------------- 1 | get_channel($slug); 14 | ?> 15 | 16 | 17 | 18 | 19 | <?= $channel->title; ?> 20 | 21 | 22 | 23 | 24 | each_item(function($item) {?> 25 | 26 |
27 |

generated_title ?>

28 |
29 | 30 | is_image()) { ?> 31 | 32 | 33 | 34 |
35 | description_html ?> 36 |
37 | 38 | 39 | is_link()){ ?> 40 | 41 | 42 | 43 |
44 | description_html ?> 45 |
46 | 47 | 48 | is_text()){ ?> 49 |
50 |

content_html ?>

51 |
52 |
53 | description_html ?> 54 |
55 | 56 | 57 | is_embed()){ ?> 58 |
59 | embed['html'] ?> 60 |
61 |
62 | description_html ?> 63 |
64 | 65 | 66 | 67 | is_attachment()){ ?> 68 |

attachment['file_name'] ?> (download)

69 | 70 | 71 |
72 |
73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /examples/1_document/permalink.php: -------------------------------------------------------------------------------- 1 | get_block($_GET['id']); 14 | ?> 15 | 16 | 17 | 18 | 19 | <?= $channel->title; ?> 20 | 21 | 22 | 28 | 29 | 30 | 31 |
32 |
33 |

generated_title ?>

34 |
35 | 36 | is_image()) { ?> 37 | 38 | 39 | 40 |
41 | description_html ?> 42 |
43 | 44 | 45 | is_link()){ ?> 46 | 47 | 48 | 49 |
50 | description_html ?> 51 |
52 | 53 | 54 | is_text()){ ?> 55 |
56 |

content_html ?>

57 |
58 |
59 | description_html ?> 60 |
61 | 62 | 63 | is_embed()){ ?> 64 |
65 | embed['html'] ?> 66 |
67 |
68 | description_html ?> 69 |
70 | 71 | 72 | 73 | is_attachment()){ ?> 74 |

attachment['file_name'] ?> (download)

75 | 76 |
77 |

Back

78 |
79 |
80 | 81 | -------------------------------------------------------------------------------- /examples/2_channelinchannel/view.php: -------------------------------------------------------------------------------- 1 | get_channel($slug); 14 | ?> 15 | 16 | 17 | 18 | 19 | <?= $channel->title; ?> 20 | 21 | 22 | 35 | 36 | 37 | 38 | 45 | 46 |
47 | 48 | 49 | 50 | 51 | each_item(function($item) {?> 52 | 53 |
54 |

generated_title ?>

55 |
56 | 57 | is_image()) { ?> 58 | 59 | 60 | 61 |
62 | description_html ?> 63 |
64 | 65 | 66 | is_link()){ ?> 67 | 68 | 69 | 70 |
71 | description_html ?> 72 |
73 | 74 | 75 | is_text()){ ?> 76 |
77 |

content_html ?>

78 |
79 |
80 | description_html ?> 81 |
82 | 83 | 84 | is_embed()){ ?> 85 |
86 | embed['html'] ?> 87 |
88 |
89 | description_html ?> 90 |
91 | 92 | 93 | 94 | is_attachment()){ ?> 95 |

attachment['file_name'] ?> (download)

96 | 97 | 98 | is_channel()){ ?> 99 | 100 |

title ?>

101 | 102 | 103 | 104 |
105 |
106 | 107 | 108 | 109 | 110 | 111 |
112 | 113 | -------------------------------------------------------------------------------- /examples/2_channelinchannel/index.php: -------------------------------------------------------------------------------- 1 | get_channel($slug); 14 | ?> 15 | 16 | 17 | 18 | 19 | <?= $channel->title; ?> 20 | 21 | 22 | 35 | 36 | 37 | 38 | 44 | 45 |
46 | 47 | 48 | 49 | 50 | each_item(function($item) {?> 51 | 52 |
53 |

generated_title ?>

54 |
55 | 56 | is_image()) { ?> 57 | 58 | 59 | 60 |
61 | description_html ?> 62 |
63 | 64 | 65 | is_link()){ ?> 66 | 67 | 68 | 69 |
70 | description_html ?> 71 |
72 | 73 | 74 | is_text()){ ?> 75 |
76 |

content_html ?>

77 |
78 |
79 | description_html ?> 80 |
81 | 82 | 83 | is_embed()){ ?> 84 |
85 | embed['html'] ?> 86 |
87 |
88 | description_html ?> 89 |
90 | 91 | 92 | 93 | is_attachment()){ ?> 94 |

attachment['file_name'] ?> (download)

95 | 96 | 97 | is_channel()){ ?> 98 | 99 | 100 | 101 | 102 | 103 |

title ?>

104 | 105 | 106 | 107 |
108 |
109 | 110 | 111 | 112 | 113 | 114 |
115 | 116 | -------------------------------------------------------------------------------- /examples/4_drawings/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Drawings 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 21 |
22 | 23 | 133 | 134 | 135 | -------------------------------------------------------------------------------- /examples/1_document/index.php: -------------------------------------------------------------------------------- 1 | set_page(); // this checks if page is set, if not sets page to 1 14 | $per = 5; // how many items per page 15 | $slug = 'arena-influences'; // channel slug (e.g. http://are.na/arena-influences) 16 | 17 | $channel = $arena->get_channel($slug, array('page' => $page, 'per' => $per)); 18 | ?> 19 | 20 | 21 | 22 | 23 | <?= $channel->title; ?> 24 | 25 | 26 | 32 | 33 | 34 | 35 | 58 | 59 |
60 | 61 | 62 | 63 | 64 | each_item(function($item) {?> 65 | 66 |
67 |

generated_title ?> [#]

68 |
69 | 70 | is_image()) { ?> 71 | 72 | 73 | 74 |
75 | description_html ?> 76 |
77 | 78 | 79 | is_link()){ ?> 80 | 81 | 82 | 83 |
84 | description_html ?> 85 |
86 | 87 | 88 | is_text()){ ?> 89 |
90 |

content_html ?>

91 |
92 |
93 | description_html ?> 94 |
95 | 96 | 97 | is_embed()){ ?> 98 |
99 | embed['html'] ?> 100 |
101 |
102 | description_html ?> 103 |
104 | 105 | 106 | 107 | is_attachment()){ ?> 108 |

attachment['file_name'] ?> (download)

109 | 110 | 111 | 112 |
113 |
114 | 115 | 116 | 117 | 118 | 119 |

120 | 121 |
122 |

123 | total_pages > 1){ ?>Pages: 124 | each_page($page, function($num, $current_page){ ?> 125 | 126 | 127 | 128 | 129 | 130 | 131 |

132 |
133 | 134 |
135 | 136 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Arena PHP 2 | ![COOL PHP](http://s3.amazonaws.com/arena_images/51397/original_9a676dd6d3b2e273028dc58cb8dcd7e2.png) 3 | ## Contents 4 | 5 | * [Setup](#setup) 6 | * [Channel](#channel) 7 | * [Block](#block) 8 | * [User](#user) 9 | * [Resources](#resources) 10 | * [Contribute](#contribute) 11 | * [Acknowledgements](#acknowledgements) 12 | 13 | ## Setup 14 | 15 | Include the Arena class: 16 | ``` 17 | include 'arena.php'; 18 | ``` 19 | 20 | Or install with [Composer](https://getcomposer.org/) and require the autoload: 21 | ``` 22 | require 'vendor/autoload.php'; 23 | ``` 24 | 25 | Then set a new instance: 26 | ``` 27 | $arena = new Arena(); 28 | ``` 29 | 30 | *Optional*: To authenticate your application (with your personal access token), open config.php (in the /lib folder) and set your auth token: 31 | ``` 32 | $config['access_token'] = 'YOUR AUTH TOKEN HERE' 33 | ``` 34 | Your access token can be retrieved from http://dev.are.na . 35 | 36 | ## Channel 37 | 38 | Channels are organizational structures for blocks (and sometimes other channels) with permissions and other meta information. Channels retrieved with this library all come in the form of objects, and their attributes accessible in the form of $this->attribute, (e.g. $channel->title). 39 | 40 | ### Retrieving a channel: 41 | 42 | ``` 43 | get_channel($slug, array('page' => $page, 'per' => $per)); ?> 44 | ``` 45 | returns: 46 | 47 | ``` 48 | { 49 | id: 1546, 50 | title: "blog.are.na", 51 | created_at: "2012-03-12T15:13:27Z", 52 | updated_at: "2012-11-03T22:28:25Z", 53 | published: true, 54 | open: false, 55 | collaboration: true, 56 | slug: "blog-are-na", 57 | length: 45, 58 | kind: "default", 59 | status: "closed", 60 | user_id: 15, 61 | contents_updated_at: "2012-10-23T16:30:50Z", 62 | class: "Channel", 63 | base_class: "Channel", 64 | user: { 65 | id: 15, 66 | slug: "charles-broskoski", 67 | username: "Charles Broskoski", 68 | first_name: "Charles", 69 | last_name: "Broskoski", 70 | full_name: "Charles Broskoski", 71 | avatar: "http://gravatar.com/avatar/c6ea2918c7da408451f528255632b58d.png?s=40&d=mm&r=R&d=http://s3.amazonaws.com/arena_assets/assets/interface/missing.png", 72 | email: "broskoski@gmail.com", 73 | channel_count: 75, 74 | following_count: 419, 75 | profile_id: 111, 76 | follower_count: 157, 77 | class: "User", 78 | initials: "CB" 79 | }, 80 | total_pages: 1, 81 | current_page: 1, 82 | per: 1000, 83 | follower_count: 7, 84 | contents: [ 85 | .... 86 | ], 87 | collaborators: [ 88 | { 89 | id: 17, 90 | slug: "damon-zucconi", 91 | username: "Damon Zucconi", 92 | first_name: "Damon", 93 | last_name: "Zucconi", 94 | full_name: "Damon Zucconi", 95 | avatar: "http://gravatar.com/avatar/649c4301c6c5c9605fbf87e003427767.png?s=40&d=mm&r=R&d=http://s3.amazonaws.com/arena_assets/assets/interface/missing.png", 96 | email: "mail@damonzucconi.com", 97 | channel_count: 117, 98 | following_count: 283, 99 | profile_id: 105, 100 | follower_count: 148, 101 | class: "User", 102 | initials: "DZ" 103 | } 104 | ] 105 | } 106 | ``` 107 | 108 | The Channel class can (and should) be extended to serve particular needs and goals, but there are a few convience methods included in this extremely early version of the library. 109 | 110 | ### Sorting a channel's contents 111 | At the moment, there is no API support for retrieving contents in a specific order, so for now we can sort the channel's contents after the fact (please keep in mind that if you are paginating, you are only going to be sorting the sum of what you retrieved). 112 | 113 | Options for sorting: 114 | + *asc* (ascending by date) 115 | + *desc* (descending by date) 116 | + *position* (sorted by user determined position in the channel, this is default) 117 | 118 | ``` 119 | set_sort_order($direction) ?> 120 | ``` 121 | 122 | ### Printing a list of authors (main author and all collaborators) 123 | ``` 124 | authors_to_sentence(); ?> 125 | ``` 126 | Example output: 'Charles Broskoski, John Michael Boling, Dena Yago, Damon Zucconi, J. Stuart Moore, and Emily Segal' 127 | 128 | ### Looping through channel contents (blocks and channels) 129 | 130 | For the sake of simplicity, contents in a channel are all set to class 'Block'. The contents can be looped through using the each_item() method like so: 131 | ``` 132 | each_item(function($item) {?> 133 | // Item templates go here 134 | 135 | ``` 136 | 137 | ## Block 138 | 139 | For now block methods are mostly for template simplicity, this class should also be extended to accomplish specific goals. 140 | 141 | ### Block classes 142 | 143 | To check the specific type of block in an item loop (or otherwise) use these methods (is_image(), is_text(), is_embed(), is_link(), is_attachment(), is_channel()) like so: 144 | 145 | ``` 146 | each_item(function($item) {?> 147 | is_image()) { ?> 148 | 149 | 150 | 151 | 152 | 153 | ``` 154 | 155 | ### Retrieving a specific Block 156 | 157 | You can also retrieve specific blocks from the API. This can be used to handle permalinking of specific content. 158 | 159 | ``` 160 | get_block($id) ?> # $id = 1000 161 | ``` 162 | returns: 163 | ``` 164 | { 165 | id: 1000, 166 | title: "caveman time + globalization", 167 | updated_at: "2011-12-13T23:42:51Z", 168 | created_at: "2011-08-13T00:22:29Z", 169 | state: "available", 170 | comment_count: 0, 171 | generated_title: "caveman time + globalization", 172 | class: "Image", 173 | base_class: "Block", 174 | content: "caveman time and globalization", 175 | content_html: "

caveman time and globalization

", 176 | description: "caveman time and globalization", 177 | description_html: "

caveman time and globalization

", 178 | image: { 179 | filename: "mcd-billboard.gif", 180 | content_type: "image/gif", 181 | updated_at: "2011-08-13T00:22:28Z", 182 | thumb: { 183 | url: "http://s3.amazonaws.com/arena_images/1000/thumb_mcd-billboard.gif" 184 | }, 185 | display: { 186 | url: "http://s3.amazonaws.com/arena_images/1000/display_mcd-billboard.gif" 187 | }, 188 | original: { 189 | url: "http://s3.amazonaws.com/arena_images/1000/original_mcd-billboard.gif", 190 | file_size: 48328, 191 | file_size_display: "47.2 KB" 192 | } 193 | }, 194 | user: { 195 | id: 53, 196 | slug: "sun-an", 197 | username: "sun an", 198 | first_name: "sun", 199 | last_name: "an", 200 | full_name: "sun an", 201 | avatar: "http://gravatar.com/avatar/5dc858da6a9f2c8f20757e36119ef827.png?s=40&d=mm&r=R&d=http://s3.amazonaws.com/arena_assets/assets/interface/missing.png", 202 | email: "mail@sun-an.com", 203 | channel_count: 8, 204 | following_count: 5, 205 | profile_id: 298, 206 | follower_count: 15, 207 | class: "User", 208 | initials: "sa" 209 | }, 210 | connections: [ 211 | { 212 | id: 298, 213 | title: "sun an", 214 | created_at: "2011-08-13T00:17:45Z", 215 | updated_at: "2012-01-11T21:22:30Z", 216 | published: true, 217 | open: true, 218 | collaboration: false, 219 | slug: "sun-an", 220 | length: 3, 221 | kind: "profile", 222 | status: "public", 223 | user_id: 53, 224 | contents_updated_at: "2012-01-11T21:22:30Z", 225 | class: "Channel", 226 | base_class: "Channel" 227 | }, 228 | { 229 | id: 208, 230 | title: "Gideon Yago", 231 | created_at: "2011-08-03T19:14:00Z", 232 | updated_at: "2012-01-11T21:22:29Z", 233 | published: true, 234 | open: true, 235 | collaboration: false, 236 | slug: "gideon-yago", 237 | length: 1, 238 | kind: "profile", 239 | status: "public", 240 | user_id: 29, 241 | contents_updated_at: "2012-01-11T21:22:29Z", 242 | class: "Channel", 243 | base_class: "Channel" 244 | } 245 | ] 246 | } 247 | ``` 248 | 249 | ### Creating a new block 250 | 251 | You can do basic POST operations with this library to create new Blocks for channels. 252 | 253 | Note: To accomplish this you **must** provide an access token to authenticate the POST request. 254 | ``` 255 | 'http://imgs.xkcd.com/comics/poll_watching.png'); 258 | $arena->create_block($channel_slug, $block_attrs); 259 | ?> 260 | ``` 261 | 262 | 263 | ## User 264 | 265 | ### Retrieving a specific user's info 266 | 267 | ``` 268 | get_user($user_slug) ?> # $user_slug = 'charles-broskoski' 269 | ``` 270 | 271 | returns: 272 | 273 | ``` 274 | { 275 | id: 15, 276 | slug: "charles-broskoski", 277 | username: "Charles Broskoski", 278 | first_name: "Charles", 279 | last_name: "Broskoski", 280 | full_name: "Charles Broskoski", 281 | avatar: "http://gravatar.com/avatar/c6ea2918c7da408451f528255632b58d.png?s=40&d=mm&r=R&d=http://s3.amazonaws.com/arena_assets/assets/interface/missing.png", 282 | email: "broskoski@gmail.com", 283 | channel_count: 76, 284 | following_count: 420, 285 | profile_id: 111, 286 | follower_count: 157, 287 | class: "User", 288 | initials: "CB" 289 | } 290 | ``` 291 | 292 | ### Retrieving a user's channel list 293 | 294 | ``` 295 | get_user_channels($user_slug)?> 296 | ``` 297 | 298 | This returns an object that contains an array of Channel objects (note: these channels do not have block content included in them, only base representations of the channels are returned). 299 | 300 | ## Resources 301 | 302 | + [Examples](https://github.com/arenahq/arena-php/tree/master/examples) 303 | + [dev.are.na](http://dev.are.na) 304 | 305 | ## Contribute 306 | 307 | Please fork and contribute! Also let us know if you are using the library on your site! 308 | 309 | [arena@are.na](mailto:arena@are.na) 310 | 311 | ## Acknowledgements 312 | 313 | This project includes the wonderful [Underscore.php](http://brianhaveri.github.com/Underscore.php/) without which I would have never agreed to do this. 314 | -------------------------------------------------------------------------------- /lib/__.php: -------------------------------------------------------------------------------- 1 | 0) $__->_wrapped = $item; 15 | return $__; 16 | } 17 | 18 | // Underscore.php 19 | class __ { 20 | 21 | // Start the chain 22 | private $_chained = false; // Are we in a chain? 23 | public function chain($item=null) { 24 | list($item) = self::_wrapArgs(func_get_args(), 1); 25 | 26 | $__ = (isset($this) && isset($this->_chained) && $this->_chained) ? $this : __($item); 27 | $__->_chained = true; 28 | return $__; 29 | } 30 | 31 | 32 | // End the chain 33 | public function value() { 34 | return (isset($this)) ? $this->_wrapped : null; 35 | } 36 | 37 | 38 | // Invoke the iterator on each item in the collection 39 | public function each($collection=null, $iterator=null) { 40 | list($collection, $iterator) = self::_wrapArgs(func_get_args(), 2); 41 | 42 | if(is_null($collection)) return self::_wrap(null); 43 | 44 | $collection = (array) self::_collection($collection); 45 | if(count($collection) === 0) return self::_wrap(null); 46 | 47 | foreach($collection as $k=>$v) { 48 | call_user_func($iterator, $v, $k, $collection); 49 | } 50 | return self::_wrap(null); 51 | } 52 | 53 | 54 | // Return an array of values by mapping each item through the iterator 55 | // map alias: collect 56 | public function collect($collection=null, $iterator=null) { return self::map($collection, $iterator); } 57 | public function map($collection=null, $iterator=null) { 58 | list($collection, $iterator) = self::_wrapArgs(func_get_args(), 2); 59 | 60 | if(is_null($collection)) return self::_wrap(array()); 61 | 62 | $collection = (array) self::_collection($collection); 63 | if(count($collection) === 0) self::_wrap(array()); 64 | 65 | $return = array(); 66 | foreach($collection as $k=>$v) { 67 | $return[] = call_user_func($iterator, $v, $k, $collection); 68 | } 69 | return self::_wrap($return); 70 | } 71 | 72 | 73 | // Reduce a collection to a single value 74 | // reduce aliases: foldl, inject 75 | public function foldl($collection=null, $iterator=null, $memo=null) { return self::reduce($collection, $iterator, $memo); } 76 | public function inject($collection=null, $iterator=null, $memo=null) { return self::reduce($collection, $iterator, $memo); } 77 | public function reduce($collection=null, $iterator=null, $memo=null) { 78 | list($collection, $iterator, $memo) = self::_wrapArgs(func_get_args(), 3); 79 | 80 | if(!is_object($collection) && !is_array($collection)) { 81 | if(is_null($memo)) throw new Exception('Invalid object'); 82 | else return self::_wrap($memo); 83 | } 84 | 85 | return self::_wrap(array_reduce($collection, $iterator, $memo)); 86 | } 87 | 88 | 89 | // Right-associative version of reduce 90 | // reduceRight alias: foldr 91 | public function foldr($collection=null, $iterator=null, $memo=null) { return self::reduceRight($collection, $iterator, $memo); } 92 | public function reduceRight($collection=null, $iterator=null, $memo=null) { 93 | list($collection, $iterator, $memo) = self::_wrapArgs(func_get_args(), 3); 94 | 95 | if(!is_object($collection) && !is_array($collection)) { 96 | if(is_null($memo)) throw new Exception('Invalid object'); 97 | else return self::_wrap($memo); 98 | } 99 | 100 | krsort($collection); 101 | 102 | $__ = new self; 103 | return self::_wrap($__->reduce($collection, $iterator, $memo)); 104 | } 105 | 106 | 107 | // Extract an array of values for a given property 108 | public function pluck($collection=null, $key=null) { 109 | list($collection, $key) = self::_wrapArgs(func_get_args(), 2); 110 | 111 | $collection = (array) self::_collection($collection); 112 | 113 | $return = array(); 114 | foreach($collection as $item) { 115 | foreach($item as $k=>$v) { 116 | if($k === $key) $return[] = $v; 117 | } 118 | } 119 | return self::_wrap($return); 120 | } 121 | 122 | 123 | // Does the collection contain this value? 124 | // includ alias: contains 125 | public function contains($collection=null, $val=null) { return self::includ($collection, $val); } 126 | public function includ($collection=null, $val=null) { 127 | list($collection, $val) = self::_wrapArgs(func_get_args(), 2); 128 | 129 | $collection = (array) self::_collection($collection); 130 | 131 | return self::_wrap((array_search($val, $collection, true) !== false)); 132 | } 133 | 134 | 135 | // Invoke the named function over each item in the collection, optionally passing arguments to the function 136 | public function invoke($collection=null, $function_name=null, $arguments=null) { 137 | $args = self::_wrapArgs(func_get_args(), 2); 138 | $__ = new self; 139 | list($collection, $function_name) = $__->first($args, 2); 140 | $arguments = $__->rest(func_get_args(), 2); 141 | 142 | // If passed an array or string, return an array 143 | // If passed an object, return an object 144 | $is_obj = is_object($collection); 145 | $result = (empty($arguments)) ? array_map($function_name, (array) $collection) : array_map($function_name, (array) $collection, $arguments); 146 | if($is_obj) $result = (object) $result; 147 | 148 | return self::_wrap($result); 149 | } 150 | 151 | 152 | // Does any values in the collection meet the iterator's truth test? 153 | // any alias: some 154 | public function some($collection=null, $iterator=null) { return self::any($collection, $iterator); } 155 | public function any($collection=null, $iterator=null) { 156 | list($collection, $iterator) = self::_wrapArgs(func_get_args(), 2); 157 | 158 | $collection = self::_collection($collection); 159 | 160 | $__ = new self; 161 | if(!is_null($iterator)) $collection = $__->map($collection, $iterator); 162 | if(count($collection) === 0) return self::_wrap(false); 163 | 164 | return self::_wrap(is_int(array_search(true, $collection, false))); 165 | } 166 | 167 | 168 | // Do all values in the collection meet the iterator's truth test? 169 | // all alias: every 170 | public function every($collection=null, $iterator=null) { return self::all($collection, $iterator); } 171 | public function all($collection=null, $iterator=null) { 172 | list($collection, $iterator) = self::_wrapArgs(func_get_args(), 2); 173 | 174 | $collection = self::_collection($collection); 175 | 176 | $__ = new self; 177 | if(!is_null($iterator)) $collection = $__->map($collection, $iterator); 178 | $collection = (array) $collection; 179 | if(count($collection) === 0) return true; 180 | 181 | return self::_wrap(is_bool(array_search(false, $collection, false))); 182 | } 183 | 184 | 185 | // Return an array of values that pass the truth iterator test 186 | // filter alias: select 187 | public function select($collection=null, $iterator=null) { return self::filter($collection, $iterator); } 188 | public function filter($collection=null, $iterator=null) { 189 | list($collection, $iterator) = self::_wrapArgs(func_get_args(), 2); 190 | 191 | $collection = self::_collection($collection); 192 | 193 | $return = array(); 194 | foreach($collection as $val) { 195 | if(call_user_func($iterator, $val)) $return[] = $val; 196 | } 197 | return self::_wrap($return); 198 | } 199 | 200 | 201 | // Return an array where the items failing the truth test are removed 202 | public function reject($collection=null, $iterator=null) { 203 | list($collection, $iterator) = self::_wrapArgs(func_get_args(), 2); 204 | 205 | $collection = self::_collection($collection); 206 | 207 | $return = array(); 208 | foreach($collection as $val) { 209 | if(!call_user_func($iterator, $val)) $return[] = $val; 210 | } 211 | return self::_wrap($return); 212 | } 213 | 214 | 215 | // Return the value of the first item passing the truth iterator test 216 | // find alias: detect 217 | public function detect($collection=null, $iterator=null) { return self::find($collection, $iterator); } 218 | public function find($collection=null, $iterator=null) { 219 | list($collection, $iterator) = self::_wrapArgs(func_get_args(), 2); 220 | 221 | $collection = self::_collection($collection); 222 | 223 | foreach($collection as $val) { 224 | if(call_user_func($iterator, $val)) return $val; 225 | } 226 | return self::_wrap(false); 227 | } 228 | 229 | 230 | // How many items are in this collection? 231 | public function size($collection=null) { 232 | list($collection) = self::_wrapArgs(func_get_args(), 1); 233 | 234 | $collection = self::_collection($collection); 235 | 236 | return self::_wrap(count((array) $collection)); 237 | } 238 | 239 | 240 | // Get the first element of an array. Passing n returns the first n elements. 241 | // first alias: head 242 | public function head($collection=null, $n=null) { return self::first($collection, $n); } 243 | public function first($collection=null, $n=null) { 244 | list($collection, $n) = self::_wrapArgs(func_get_args(), 2); 245 | 246 | $collection = self::_collection($collection); 247 | 248 | if($n === 0) return self::_wrap(array()); 249 | if(is_null($n)) return self::_wrap(current(array_splice($collection, 0, 1, true))); 250 | return self::_wrap(array_splice($collection, 0, $n, true)); 251 | } 252 | 253 | 254 | // Get the rest of the array elements. Passing n returns from that index onward. 255 | public function tail($collection=null, $index=null) { return self::rest($collection, $index); } 256 | public function rest($collection=null, $index=null) { 257 | list($collection, $index) = self::_wrapArgs(func_get_args(), 2); 258 | if(is_null($index)) $index = 1; 259 | 260 | $collection = self::_collection($collection); 261 | 262 | return self::_wrap(array_splice($collection, $index)); 263 | } 264 | 265 | 266 | // Return everything but the last array element. Passing n excludes the last n elements. 267 | public function initial($collection=null, $n=null) { 268 | list($collection, $n) = self::_wrapArgs(func_get_args(), 2); 269 | 270 | $collection = (array) self::_collection($collection); 271 | 272 | if(is_null($n)) $n = 1; 273 | $first_index = count($collection) - $n; 274 | $__ = new self; 275 | return self::_wrap($__->first($collection, $first_index)); 276 | } 277 | 278 | 279 | // Get the last element from an array. Passing n returns the last n elements. 280 | public function last($collection=null, $n=null) { 281 | list($collection, $n) = self::_wrapArgs(func_get_args(), 2); 282 | $collection = self::_collection($collection); 283 | 284 | if($n === 0) $result = array(); 285 | elseif($n === 1 || is_null($n)) $result = array_pop($collection); 286 | else { 287 | $__ = new self; 288 | $result = $__->rest($collection, -$n); 289 | } 290 | 291 | return self::_wrap($result); 292 | } 293 | 294 | 295 | // Return a copy of the array with falsy values removed 296 | public function compact($collection=null) { 297 | list($collection) = self::_wrapArgs(func_get_args(), 1); 298 | 299 | $collection = self::_collection($collection); 300 | 301 | $__ = new self; 302 | return self::_wrap($__->select($collection, function($val) { 303 | return (bool) $val; 304 | })); 305 | } 306 | 307 | 308 | // Flattens a multidimensional array 309 | public function flatten($collection=null, $shallow=null) { 310 | list($collection, $shallow) = self::_wrapArgs(func_get_args(), 2); 311 | 312 | $collection = self::_collection($collection); 313 | 314 | $return = array(); 315 | if(count($collection) > 0) { 316 | foreach($collection as $item) { 317 | if(is_array($item)) { 318 | $__ = new self; 319 | $return = array_merge($return, ($shallow) ? $item : $__->flatten($item)); 320 | } 321 | else $return[] = $item; 322 | } 323 | } 324 | return self::_wrap($return); 325 | } 326 | 327 | 328 | // Returns a copy of the array with all instances of val removed 329 | public function without($collection=null, $val=null) { 330 | $args = self::_wrapArgs(func_get_args(), 1); 331 | $collection = $args[0]; 332 | $collection = self::_collection($collection); 333 | 334 | $num_args = count($args); 335 | if($num_args === 1) return self::_wrap($collection); 336 | if(count($collection) === 0) return self::_wrap($collection); 337 | 338 | $__ = new self; 339 | $removes = $__->rest($args); 340 | foreach($removes as $remove) { 341 | $remove_keys = array_keys($collection, $remove, true); 342 | if(count($remove_keys) > 0) { 343 | foreach($remove_keys as $key) { 344 | unset($collection[$key]); 345 | } 346 | } 347 | } 348 | return self::_wrap($collection); 349 | } 350 | 351 | 352 | // Return an array of the unique values 353 | // uniq alias: unique 354 | public function unique($collection=null, $is_sorted=null, $iterator=null) { return self::uniq($collection, $is_sorted, $iterator); } 355 | public function uniq($collection=null, $is_sorted=null, $iterator=null) { 356 | list($collection, $is_sorted, $iterator) = self::_wrapArgs(func_get_args(), 3); 357 | 358 | $collection = self::_collection($collection); 359 | 360 | $return = array(); 361 | if(count($collection) === 0) return self::_wrap($return); 362 | 363 | $calculated = array(); 364 | foreach($collection as $item) { 365 | $val = (!is_null($iterator)) ? $iterator($item) : $item; 366 | if(is_bool(array_search($val, $calculated, true))) { 367 | $calculated[] = $val; 368 | $return[] = $item; 369 | } 370 | } 371 | 372 | return self::_wrap($return); 373 | } 374 | 375 | 376 | // Returns an array containing the intersection of all the arrays 377 | public function intersection($array=null) { 378 | $arrays = self::_wrapArgs(func_get_args(), 1); 379 | 380 | if(count($arrays) === 1) return self::_wrap($array); 381 | 382 | $__ = new self; 383 | $return = $__->first($arrays); 384 | foreach($__->rest($arrays) as $next) { 385 | if(!$__->isArray($next)) $next = str_split((string) $next); 386 | 387 | $return = array_intersect($return, $next); 388 | } 389 | 390 | return self::_wrap(array_values($return)); 391 | } 392 | 393 | 394 | // Merge together multiple arrays 395 | public function union($array=null) { 396 | $arrays = self::_wrapArgs(func_get_args(), 1); 397 | 398 | if(count($arrays) === 1) return self::_wrap($array); 399 | 400 | $__ = new self; 401 | return self::_wrap($__->flatten(array_values(array_unique(call_user_func_array('array_merge', $arrays))))); 402 | } 403 | 404 | 405 | // Get the difference between two arrays 406 | public function difference($array_one=null, $array_two=null) { 407 | $arrays = self::_wrapArgs(func_get_args(), 1); 408 | 409 | return self::_wrap(array_values(call_user_func_array('array_diff', $arrays))); 410 | } 411 | 412 | 413 | // Get the index of the first match 414 | public function indexOf($collection=null, $item=null) { 415 | list($collection, $item) = self::_wrapArgs(func_get_args(), 2); 416 | 417 | $collection = self::_collection($collection); 418 | 419 | $key = array_search($item, $collection, true); 420 | return self::_wrap((is_bool($key)) ? -1 : $key); 421 | } 422 | 423 | 424 | // Get the index of the last match 425 | public function lastIndexOf($collection=null, $item=null) { 426 | list($collection, $item) = self::_wrapArgs(func_get_args(), 2); 427 | 428 | $collection = self::_collection($collection); 429 | 430 | krsort($collection); 431 | $__ = new self; 432 | return self::_wrap($__->indexOf($collection, $item)); 433 | } 434 | 435 | 436 | // Returns an array of integers from start to stop (exclusive) by step 437 | public function range($stop=null) { 438 | $args = self::_wrapArgs(func_get_args(), 1); 439 | 440 | $__ = new self; 441 | $args = $__->reject($args, function($val) { 442 | return is_null($val); 443 | }); 444 | 445 | $num_args = count($args); 446 | switch($num_args) { 447 | case 1: 448 | list($start, $stop, $step) = array(0, $args[0], 1); 449 | break; 450 | case 2: 451 | list($start, $stop, $step) = array($args[0], $args[1], 1); 452 | if($stop < $start) return self::_wrap(array()); 453 | break; 454 | default: 455 | list($start, $stop, $step) = array($args[0], $args[1], $args[2]); 456 | if($step > 0 && $step > $stop) return self::_wrap(array($start)); 457 | } 458 | $results = range($start, $stop, $step); 459 | 460 | // Switch inclusive to exclusive 461 | if($step > 0 && $__->last($results) >= $stop) array_pop($results); 462 | elseif($step < 0 && $__->last($results) <= $stop) array_pop($results); 463 | 464 | return self::_wrap($results); 465 | } 466 | 467 | 468 | // Merges arrays 469 | public function zip($array=null) { 470 | $arrays = self::_wrapArgs(func_get_args()); 471 | $num_arrays = count($arrays); 472 | if($num_arrays === 1) return self::_wrap($array); 473 | 474 | $__ = new self; 475 | $num_return_arrays = $__->max($__->map($arrays, function($array) { 476 | return count($array); 477 | })); 478 | $return_arrays = $__->range($num_return_arrays); 479 | foreach($return_arrays as $k=>$v) { 480 | if(!is_array($return_arrays[$k])) $return_arrays[$k] = array(); 481 | 482 | foreach($arrays as $a=>$array) { 483 | $return_arrays[$k][$a] = array_key_exists($k, $array) ? $array[$k] : null; 484 | } 485 | } 486 | 487 | return self::_wrap($return_arrays); 488 | } 489 | 490 | 491 | // Get the max value in the collection 492 | public function max($collection=null, $iterator=null) { 493 | list($collection, $iterator) = self::_wrapArgs(func_get_args(), 2); 494 | 495 | if(is_null($iterator)) return self::_wrap(max($collection)); 496 | 497 | $results = array(); 498 | foreach($collection as $k=>$item) { 499 | $results[$k] = $iterator($item); 500 | } 501 | arsort($results); 502 | $__ = new self; 503 | $first_key = $__->first(array_keys($results)); 504 | return $collection[$first_key]; 505 | } 506 | 507 | 508 | // Get the min value in the collection 509 | public function min($collection=null, $iterator=null) { 510 | list($collection, $iterator) = self::_wrapArgs(func_get_args(), 2); 511 | 512 | if(is_null($iterator)) return self::_wrap(min($collection)); 513 | 514 | $results = array(); 515 | foreach($collection as $k=>$item) { 516 | $results[$k] = $iterator($item); 517 | } 518 | asort($results); 519 | $__ = new self; 520 | $first_key = $__->first(array_keys($results)); 521 | return self::_wrap($collection[$first_key]); 522 | } 523 | 524 | 525 | // Sort the collection by return values from the iterator 526 | public function sortBy($collection=null, $iterator=null) { 527 | list($collection, $iterator) = self::_wrapArgs(func_get_args(), 2); 528 | 529 | $results = array(); 530 | foreach($collection as $k=>$item) { 531 | $results[$k] = $iterator($item); 532 | } 533 | asort($results); 534 | foreach($results as $k=>$v) { 535 | $results[$k] = $collection[$k]; 536 | } 537 | return self::_wrap(array_values($results)); 538 | } 539 | 540 | 541 | // Group the collection by return values from the iterator 542 | public function groupBy($collection=null, $iterator=null) { 543 | list($collection, $iterator) = self::_wrapArgs(func_get_args(), 2); 544 | 545 | $result = array(); 546 | $collection = (array) $collection; 547 | foreach($collection as $k=>$v) { 548 | $key = (is_callable($iterator)) ? $iterator($v, $k) : $v[$iterator]; 549 | if(!array_key_exists($key, $result)) $result[$key] = array(); 550 | $result[$key][] = $v; 551 | } 552 | return $result; 553 | } 554 | 555 | 556 | // Returns the index at which the value should be inserted into the sorted collection 557 | public function sortedIndex($collection=null, $value=null, $iterator=null) { 558 | list($collection, $value, $iterator) = self::_wrapArgs(func_get_args(), 3); 559 | 560 | $collection = (array) self::_collection($collection); 561 | $__ = new self; 562 | 563 | $calculated_value = (!is_null($iterator)) ? $iterator($value) : $value; 564 | 565 | while(count($collection) > 1) { 566 | $midpoint = floor(count($collection) / 2); 567 | $midpoint_values = array_slice($collection, $midpoint, 1); 568 | $midpoint_value = $midpoint_values[0]; 569 | $midpoint_calculated_value = (!is_null($iterator)) ? $iterator($midpoint_value) : $midpoint_value; 570 | 571 | $collection = ($calculated_value < $midpoint_calculated_value) ? array_slice($collection, 0, $midpoint, true) : array_slice($collection, $midpoint, null, true); 572 | } 573 | $keys = array_keys($collection); 574 | 575 | return self::_wrap(current($keys) + 1); 576 | } 577 | 578 | // Shuffle the array 579 | public function shuffle($collection=null) { 580 | list($collection) = self::_wrapArgs(func_get_args(), 1); 581 | 582 | $collection = (array) self::_collection($collection); 583 | shuffle($collection); 584 | 585 | return self::_wrap($collection); 586 | } 587 | 588 | 589 | // Return the collection as an array 590 | public function toArray($collection=null) { 591 | return (array) $collection; 592 | } 593 | 594 | 595 | // Get the collection's keys 596 | public function keys($collection=null) { 597 | list($collection) = self::_wrapArgs(func_get_args(), 1); 598 | 599 | if(!is_object($collection) && !is_array($collection)) throw new Exception('Invalid object'); 600 | 601 | return self::_wrap(array_keys((array) $collection)); 602 | } 603 | 604 | 605 | // Get the collection's values 606 | public function values($collection=null) { 607 | list($collection) = self::_wrapArgs(func_get_args(), 1); 608 | 609 | return self::_wrap(array_values((array) $collection)); 610 | } 611 | 612 | 613 | // Copy all properties from the source objects into the destination object 614 | public function extend($object=null) { 615 | $args = self::_wrapArgs(func_get_args(), 1); 616 | 617 | $num_args = func_num_args(); 618 | if($num_args === 1) return $object; 619 | 620 | $is_object = is_object($object); 621 | $array = (array) $object; 622 | $__ = new self; 623 | $extensions = $__->rest(func_get_args()); 624 | foreach($extensions as $extension) { 625 | $extension = (array) $extension; 626 | $array = array_merge($array, $extension); 627 | } 628 | return self::_wrap(($is_object) ? (object) $array : $array); 629 | } 630 | 631 | 632 | // Returns the object with any missing values filled in using the defaults. 633 | public function defaults($object=null) { 634 | $args = self::_wrapArgs(func_get_args(), 1); 635 | list($object) = $args; 636 | 637 | $num_args = count($args); 638 | if($num_args === 1) return $object; 639 | 640 | $is_object = is_object($object); 641 | $array = (array) $object; 642 | $__ = new self; 643 | $extensions = $__->rest($args); 644 | foreach($extensions as $extension) { 645 | $extension = (array) $extension; 646 | $array = array_merge($extension, $array); 647 | } 648 | return self::_wrap(($is_object) ? (object) $array : $array); 649 | } 650 | 651 | 652 | // Get the names of functions available to the object 653 | // functions alias: methods 654 | public function methods($object=null) { return self::functions($object); } 655 | public function functions($object=null) { 656 | list($object) = self::_wrapArgs(func_get_args(), 1); 657 | 658 | return self::_wrap(get_class_methods(get_class($object))); 659 | } 660 | 661 | 662 | // Returns a shallow copy of the object 663 | public function clon(&$object=null) { 664 | list($object) = self::_wrapArgs(func_get_args(), 1); 665 | 666 | $clone = null; 667 | if(is_array($object)) $clone = (array) clone (object) $object; 668 | elseif(!is_object($object)) $clone = $object; 669 | elseif(!$clone) $clone = clone $object; 670 | 671 | // shallow copy object 672 | if(is_object($clone) && count($clone) > 0) { 673 | foreach($clone as $k=>$v) { 674 | if(is_array($v) || is_object($v)) $clone->$k =& $object->$k; 675 | } 676 | } 677 | 678 | // shallow copy array 679 | elseif(is_array($clone) && count($clone) > 0) { 680 | foreach($clone as $k=>$v) { 681 | if(is_array($v) || is_object($v)) $clone[$k] =& $object[$k]; 682 | } 683 | } 684 | return self::_wrap($clone); 685 | } 686 | 687 | 688 | // Invokes the interceptor on the object, then returns the object 689 | public function tap($object=null, $interceptor=null) { 690 | list($object, $interceptor) = self::_wrapArgs(func_get_args(), 2); 691 | 692 | $interceptor($object); 693 | return self::_wrap($object); 694 | } 695 | 696 | 697 | // Does the given key exist? 698 | public function has($collection=null, $key=null) { 699 | list($collection, $key) = self::_wrapArgs(func_get_args(), 2); 700 | 701 | $collection = (array) self::_collection($collection); 702 | 703 | return self::_wrap(array_key_exists($key, $collection)); 704 | } 705 | 706 | 707 | // Are these items equal? 708 | public function isEqual($a=null, $b=null) { 709 | list($a, $b) = self::_wrapArgs(func_get_args(), 2); 710 | 711 | if(isset($this) && isset($this->_chained) && $this->_chained) $a =& $this; 712 | 713 | if($a === $b) return self::_wrap(true); 714 | if(gettype($a) !== gettype($b)) return self::_wrap(false); 715 | if(is_callable($a) !== is_callable($b)) return self::_wrap(false); 716 | 717 | if($a == $b) return self::_wrap(true); 718 | 719 | // Objects and arrays compared by values 720 | if(is_object($a) || is_array($a)) { 721 | 722 | // Do either implement isEqual()? 723 | if(is_object($a) && isset($a->isEqual)) return self::_wrap($a->isEqual($b)); 724 | if(is_object($b) && isset($b->isEqual)) return self::_wrap($b->isEqual($a)); 725 | if(is_array($a) && array_key_exists('isEqual', $a)) return self::_wrap($a['isEqual']($b)); 726 | if(is_array($b) && array_key_exists('isEqual', $b)) return self::_wrap($b['isEqual']($a)); 727 | 728 | if(count($a) !== count($b)) return self::_wrap(false); 729 | 730 | $__ = new self; 731 | $keys_equal = $__->isEqual($__->keys($a), $__->keys($b)); 732 | $values_equal = $__->isEqual($__->values($a), $__->values($b)); 733 | return self::_wrap($keys_equal && $values_equal); 734 | } 735 | 736 | return self::_wrap(false); 737 | } 738 | 739 | 740 | // Is this item empty? 741 | public function isEmpty($item=null) { 742 | list($item) = self::_wrapArgs(func_get_args(), 1); 743 | 744 | return self::_wrap(is_array($item) || is_object($item)) ? !((bool) count((array) $item)) : (!(bool) $item); 745 | } 746 | 747 | 748 | // Is this item an object? 749 | public function isObject($item=null) { 750 | list($item) = self::_wrapArgs(func_get_args(), 1); 751 | return self::_wrap(is_object($item)); 752 | } 753 | 754 | 755 | // Is this item an array? 756 | public function isArray($item=null) { 757 | list($item) = self::_wrapArgs(func_get_args(), 1); 758 | return self::_wrap(is_array($item)); 759 | } 760 | 761 | 762 | // Is this item a string? 763 | public function isString($item=null) { 764 | list($item) = self::_wrapArgs(func_get_args(), 1); 765 | return self::_wrap(is_string($item)); 766 | } 767 | 768 | 769 | // Is this item a number? 770 | public function isNumber($item=null) { 771 | list($item) = self::_wrapArgs(func_get_args(), 1); 772 | return self::_wrap((is_int($item) || is_float($item)) && !is_nan($item) && !is_infinite($item)); 773 | } 774 | 775 | 776 | // Is this item a bool? 777 | public function isBoolean($item=null) { 778 | list($item) = self::_wrapArgs(func_get_args(), 1); 779 | return self::_wrap(is_bool($item)); 780 | } 781 | 782 | 783 | // Is this item a function (by type, not by name)? 784 | public function isFunction($item=null) { 785 | list($item) = self::_wrapArgs(func_get_args(), 1); 786 | return self::_wrap(is_object($item) && is_callable($item)); 787 | } 788 | 789 | 790 | // Is this item an instance of DateTime? 791 | public function isDate($item=null) { 792 | list($item) = self::_wrapArgs(func_get_args(), 1); 793 | return self::_wrap(is_object($item) && get_class($item) === 'DateTime'); 794 | } 795 | 796 | 797 | // Is this item a NaN value? 798 | public function isNaN($item=null) { 799 | list($item) = self::_wrapArgs(func_get_args(), 1); 800 | return self::_wrap(is_nan($item)); 801 | } 802 | 803 | 804 | // Returns the same value passed as the argument 805 | public function identity() { 806 | $args = self::_wrapArgs(func_get_args(), 1); 807 | 808 | if(is_array($args)) return self::_wrap($args[0]); 809 | 810 | return self::_wrap(function($x) { 811 | return $x; 812 | }); 813 | } 814 | 815 | 816 | // Generate a globally unique id, optionally prefixed 817 | public $_uniqueId = -1; 818 | public function uniqueId($prefix=null) { 819 | list($prefix) = self::_wrapArgs(func_get_args(), 1); 820 | 821 | $_instance = self::getInstance(); 822 | $_instance->_uniqueId++; 823 | 824 | return (is_null($prefix)) ? self::_wrap($_instance->_uniqueId) : self::_wrap($prefix . $_instance->_uniqueId); 825 | } 826 | 827 | 828 | // Invokes the iterator n times 829 | public function times($n=null, $iterator=null) { 830 | list($n, $iterator) = self::_wrapArgs(func_get_args(), 2); 831 | if(is_null($n)) $n = 0; 832 | 833 | for($i=0; $i<$n; $i++) $iterator($i); 834 | return self::_wrap(null); 835 | } 836 | 837 | 838 | // Extend the class with your own functions 839 | private $_mixins = array(); 840 | public function mixin($functions=null) { 841 | list($functions) = self::_wrapArgs(func_get_args(), 1); 842 | 843 | $mixins =& self::getInstance()->_mixins; 844 | foreach($functions as $name=>$function) { 845 | $mixins[$name] = $function; 846 | } 847 | return self::_wrap(null); 848 | } 849 | 850 | 851 | // Allows extending methods in static context 852 | public static function __callStatic($name, $arguments) { 853 | $mixins =& self::getInstance()->_mixins; 854 | return call_user_func_array($mixins[$name], $arguments); 855 | } 856 | 857 | // Allows extending methods in non-static context 858 | public function __call($name, $arguments) { 859 | $mixins =& self::getInstance()->_mixins; 860 | $arguments = self::_wrapArgs($arguments); 861 | return call_user_func_array($mixins[$name], $arguments); 862 | } 863 | 864 | 865 | // Temporary PHP open and close tags used within templates 866 | // Allows for normal processing of templates even when 867 | // the developer uses PHP open or close tags for interpolation or evaluation 868 | const TEMPLATE_OPEN_TAG = '760e7dab2836853c63805033e514668301fa9c47'; 869 | const TEMPLATE_CLOSE_TAG= 'd228a8fa36bd7db108b01eddfb03a30899987a2b'; 870 | 871 | const TEMPLATE_DEFAULT_EVALUATE = '/<%([\s\S]+?)%>/'; 872 | const TEMPLATE_DEFAULT_INTERPOLATE= '/<%=([\s\S]+?)%>/'; 873 | const TEMPLATE_DEFAULT_ESCAPE = '/<%-([\s\S]+?)%>/'; 874 | public $_template_settings = array( 875 | 'evaluate' => self::TEMPLATE_DEFAULT_EVALUATE, 876 | 'interpolate' => self::TEMPLATE_DEFAULT_INTERPOLATE, 877 | 'escape' => self::TEMPLATE_DEFAULT_ESCAPE 878 | ); 879 | 880 | // Set template settings 881 | public function templateSettings($settings=null) { 882 | $_template_settings =& self::getInstance()->_template_settings; 883 | 884 | if(is_null($settings)) { 885 | $_template_settings = array( 886 | 'evaluate' => self::TEMPLATE_DEFAULT_EVALUATE, 887 | 'interpolate' => self::TEMPLATE_DEFAULT_INTERPOLATE, 888 | 'escape' => self::TEMPLATE_DEFAULT_ESCAPE 889 | ); 890 | return true; 891 | } 892 | 893 | foreach($settings as $k=>$v) { 894 | if(!array_key_exists($k, $_template_settings)) continue; 895 | 896 | $_template_settings[$k] = $v; 897 | } 898 | return true; 899 | } 900 | 901 | 902 | // Compile templates into functions that can be evaluated for rendering 903 | public function template($code=null, $context=null) { 904 | list($code, $context) = self::_wrapArgs(func_get_args(), 2); 905 | 906 | $class_name = __CLASS__; 907 | 908 | $return = self::_wrap(function($context=null) use ($code, $class_name) { 909 | $ts = $class_name::getInstance()->_template_settings; 910 | 911 | // Wrap escaped, interpolated, and evaluated blocks inside PHP tags 912 | extract((array) $context); 913 | preg_match_all($ts['escape'], $code, $vars, PREG_SET_ORDER); 914 | if(count($vars) > 0) { 915 | foreach($vars as $var) { 916 | $echo = $class_name::TEMPLATE_OPEN_TAG . ' echo htmlentities(' . trim($var[1]) . '); ' . $class_name::TEMPLATE_CLOSE_TAG; 917 | $code = str_replace($var[0], $echo, $code); 918 | } 919 | } 920 | preg_match_all($ts['interpolate'], $code, $vars, PREG_SET_ORDER); 921 | if(count($vars) > 0) { 922 | foreach($vars as $var) { 923 | $echo = $class_name::TEMPLATE_OPEN_TAG . ' echo ' . trim($var[1]) . '; ' . $class_name::TEMPLATE_CLOSE_TAG; 924 | $code = str_replace($var[0], $echo, $code); 925 | } 926 | } 927 | preg_match_all($ts['evaluate'], $code, $vars, PREG_SET_ORDER); 928 | if(count($vars) > 0) { 929 | foreach($vars as $var) { 930 | $echo = $class_name::TEMPLATE_OPEN_TAG . trim($var[1]) . $class_name::TEMPLATE_CLOSE_TAG; 931 | $code = str_replace($var[0], $echo, $code); 932 | } 933 | } 934 | $code = str_replace($class_name::TEMPLATE_OPEN_TAG, '', $code); 936 | 937 | // Use the output buffer to grab the return value 938 | $code = 'ob_start(); extract($context); ?>' . $code . '_wrapped) && $this->_wrapped) || !is_null($context)) ? $return($context) : $return); 946 | } 947 | 948 | // Escape 949 | public function escape($item=null) { 950 | list($item) = self::_wrapArgs(func_get_args(), 1); 951 | 952 | return self::_wrap(htmlentities($item)); 953 | } 954 | 955 | 956 | // Memoizes a function by caching the computed result. 957 | public $_memoized = array(); 958 | public function memoize($function=null, $hashFunction=null) { 959 | list($function, $hashFunction) = self::_wrapArgs(func_get_args(), 2); 960 | 961 | $_instance = (isset($this) && isset($this->_wrapped)) ? $this : self::getInstance(); 962 | 963 | return self::_wrap(function() use ($function, &$_instance, $hashFunction) { 964 | 965 | // Generate a key based on hashFunction 966 | $args = func_get_args(); 967 | if(is_null($hashFunction)) $hashFunction = function($function, $args) { 968 | 969 | // Try using var_export to identify the function 970 | return md5(join('_', array( 971 | var_export($function, true), 972 | var_export($args, true) 973 | ))); 974 | }; 975 | $key = $hashFunction($function, $args); 976 | 977 | if(!array_key_exists($key, $_instance->_memoized)) { 978 | $_instance->_memoized[$key] = call_user_func_array($function, $args); 979 | } 980 | return $_instance->_memoized[$key]; 981 | }); 982 | } 983 | 984 | 985 | // Throttles a function so that it can only be called once every wait milliseconds 986 | public $_throttled = array(); 987 | public function throttle($function=null, $wait=null) { 988 | list($function, $wait) = self::_wrapArgs(func_get_args(), 2); 989 | 990 | $_instance = (isset($this) && isset($this->_wrapped)) ? $this : self::getInstance(); 991 | 992 | return self::_wrap(function() use ($function, $wait, &$_instance) { 993 | 994 | // Try using var_export to identify the function 995 | $key = md5(join('', array( 996 | var_export($function, true), 997 | $wait 998 | ))); 999 | 1000 | $microtime = microtime(true); 1001 | $ready_to_call = (!array_key_exists($key, $_instance->_throttled) || $microtime >= $_instance->_throttled[$key]); 1002 | if($ready_to_call) { 1003 | $next_callable_time = $microtime + ($wait / 1000); 1004 | $_instance->_throttled[$key] = $next_callable_time; 1005 | return call_user_func_array($function, func_get_args()); 1006 | } 1007 | }); 1008 | } 1009 | 1010 | 1011 | // Creates a version of the function that can only be called once 1012 | public $_onced = array(); 1013 | public function once($function=null) { 1014 | list($function) = self::_wrapArgs(func_get_args(), 1); 1015 | 1016 | $_instance = (isset($this) && isset($this->_wrapped)) ? $this : self::getInstance(); 1017 | 1018 | return self::_wrap(function() use ($function, &$_instance) { 1019 | 1020 | // Try using var_export to identify the function 1021 | $key = md5(var_export($function, true)); 1022 | if(!array_key_exists($key, $_instance->_onced)) { 1023 | $_instance->_onced[$key] = call_user_func_array($function, func_get_args()); 1024 | } 1025 | 1026 | return $_instance->_onced[$key]; 1027 | }); 1028 | } 1029 | 1030 | 1031 | // Wraps the function inside the wrapper function, passing it as the first argument 1032 | public function wrap($function=null, $wrapper=null) { 1033 | list($function, $wrapper) = self::_wrapArgs(func_get_args(), 2); 1034 | 1035 | return self::_wrap(function() use ($wrapper, $function) { 1036 | $args = array_merge(array($function), func_get_args()); 1037 | return call_user_func_array($wrapper, $args); 1038 | }); 1039 | } 1040 | 1041 | 1042 | // Returns the composition of the functions 1043 | public function compose() { 1044 | $functions = self::_wrapArgs(func_get_args(), 1); 1045 | 1046 | return self::_wrap(function() use ($functions) { 1047 | $args = func_get_args(); 1048 | foreach($functions as $function) { 1049 | $args[0] = call_user_func_array($function, $args); 1050 | } 1051 | return $args[0]; 1052 | }); 1053 | } 1054 | 1055 | 1056 | // Creates a version of the function that will only run after being called count times 1057 | public $_aftered = array(); 1058 | public function after($count=null, $function=null) { 1059 | list($count, $function) = self::_wrapArgs(func_get_args(), 2); 1060 | 1061 | $_instance = (isset($this) && isset($this->_wrapped)) ? $this : self::getInstance(); 1062 | $key = md5(mt_rand()); 1063 | 1064 | $func = function() use ($function, &$_instance, $count, $key) { 1065 | if(!array_key_exists($key, $_instance->_aftered)) $_instance->_aftered[$key] = 0; 1066 | $_instance->_aftered[$key] += 1; 1067 | 1068 | if($_instance->_aftered[$key] >= $count) return call_user_func_array($function, func_get_args()); 1069 | }; 1070 | return self::_wrap(($count) ? $func : $func()); 1071 | } 1072 | 1073 | 1074 | // Singleton 1075 | private static $_instance; 1076 | public function getInstance() { 1077 | if(!isset(self::$_instance)) { 1078 | $c = __CLASS__; 1079 | self::$_instance = new $c; 1080 | } 1081 | return self::$_instance; 1082 | } 1083 | 1084 | 1085 | // All methods should wrap their returns within _wrap 1086 | // because this function understands both OO-style and functional calls 1087 | public $_wrapped; // Value passed from one chained method to the next 1088 | private function _wrap($val) { 1089 | if(isset($this) && isset($this->_chained) && $this->_chained) { 1090 | $this->_wrapped = $val; 1091 | return $this; 1092 | } 1093 | return $val; 1094 | } 1095 | 1096 | 1097 | // All methods should get their arguments from _wrapArgs 1098 | // because this function understands both OO-style and functional calls 1099 | private function _wrapArgs($caller_args, $num_args=null) { 1100 | $num_args = (is_null($num_args)) ? count($caller_args) - 1 : $num_args; 1101 | 1102 | $filled_args = array(); 1103 | if(isset($this) && isset($this->_wrapped)) { 1104 | $filled_args[] =& $this->_wrapped; 1105 | } 1106 | if(count($caller_args) > 0) { 1107 | foreach($caller_args as $k=>$v) { 1108 | $filled_args[] = $v; 1109 | } 1110 | } 1111 | 1112 | return array_pad($filled_args, $num_args, null); 1113 | } 1114 | 1115 | 1116 | // Get a collection in a way that supports strings 1117 | private function _collection($collection) { 1118 | return (!is_array($collection) && !is_object($collection)) ? str_split((string) $collection) : $collection; 1119 | } 1120 | } 1121 | -------------------------------------------------------------------------------- /examples/3_user_channels/css/bootstrap.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v2.1.1 3 | * 4 | * Copyright 2012 Twitter, Inc 5 | * Licensed under the Apache License v2.0 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Designed and built with all the love in the world @twitter by @mdo and @fat. 9 | */article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{width:auto\9;height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map_canvas img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}.text-warning{color:#c09853}.text-error{color:#b94a48}.text-info{color:#3a87ad}.text-success{color:#468847}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:1;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1{font-size:36px;line-height:40px}h2{font-size:30px;line-height:40px}h3{font-size:24px;line-height:40px}h4{font-size:18px;line-height:20px}h5{font-size:14px;line-height:20px}h6{font-size:12px;line-height:20px}h1 small{font-size:24px}h2 small{font-size:18px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal{*zoom:1}.dl-horizontal:before,.dl-horizontal:after{display:table;line-height:0;content:""}.dl-horizontal:after{clear:both}.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:25px}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:9px;font-size:14px;line-height:20px;color:#555;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}input,textarea,.uneditable-input{width:206px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal;cursor:pointer}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #ccc}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:18px;padding-left:18px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"]{float:left}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853}.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48}.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847}.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}.control-group.info>label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad}.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad}.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7ab5d3}.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad}input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{margin-bottom:5px;font-size:0;white-space:nowrap}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;font-size:14px;vertical-align:top;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append .add-on,.input-append .btn{margin-left:-1px}.input-append .add-on:last-child,.input-append .btn:last-child{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:180px}.form-horizontal .help-block{margin-bottom:0}.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block{margin-top:10px}.form-horizontal .form-actions{padding-left:180px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child,.table-bordered tfoot:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child,.table-bordered tfoot:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topleft:4px}.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9}.table-hover tbody tr:hover td,.table-hover tbody tr:hover th{background-color:#f5f5f5}table [class*=span],.row-fluid table [class*=span]{display:table-cell;float:none;margin-left:0}.table .span1{float:none;width:44px;margin-left:0}.table .span2{float:none;width:124px;margin-left:0}.table .span3{float:none;width:204px;margin-left:0}.table .span4{float:none;width:284px;margin-left:0}.table .span5{float:none;width:364px;margin-left:0}.table .span6{float:none;width:444px;margin-left:0}.table .span7{float:none;width:524px;margin-left:0}.table .span8{float:none;width:604px;margin-left:0}.table .span9{float:none;width:684px;margin-left:0}.table .span10{float:none;width:764px;margin-left:0}.table .span11{float:none;width:844px;margin-left:0}.table .span12{float:none;width:924px;margin-left:0}.table .span13{float:none;width:1004px;margin-left:0}.table .span14{float:none;width:1084px;margin-left:0}.table .span15{float:none;width:1164px;margin-left:0}.table .span16{float:none;width:1244px;margin-left:0}.table .span17{float:none;width:1324px;margin-left:0}.table .span18{float:none;width:1404px;margin-left:0}.table .span19{float:none;width:1484px;margin-left:0}.table .span20{float:none;width:1564px;margin-left:0}.table .span21{float:none;width:1644px;margin-left:0}.table .span22{float:none;width:1724px;margin-left:0}.table .span23{float:none;width:1804px;margin-left:0}.table .span24{float:none;width:1884px;margin-left:0}.table tbody tr.success td{background-color:#dff0d8}.table tbody tr.error td{background-color:#f2dede}.table tbody tr.warning td{background-color:#fcf8e3}.table tbody tr.info td{background-color:#d9edf7}.table-hover tbody tr.success:hover td{background-color:#d0e9c6}.table-hover tbody tr.error:hover td{background-color:#ebcccc}.table-hover tbody tr.warning:hover td{background-color:#faf2cc}.table-hover tbody tr.info:hover td{background-color:#c4e3f3}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;margin-top:1px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat}.icon-white,.nav-tabs>.active>a>[class^="icon-"],.nav-tabs>.active>a>[class*=" icon-"],.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png")}.icon-glass{background-position:0 0}.icon-music{background-position:-24px 0}.icon-search{background-position:-48px 0}.icon-envelope{background-position:-72px 0}.icon-heart{background-position:-96px 0}.icon-star{background-position:-120px 0}.icon-star-empty{background-position:-144px 0}.icon-user{background-position:-168px 0}.icon-film{background-position:-192px 0}.icon-th-large{background-position:-216px 0}.icon-th{background-position:-240px 0}.icon-th-list{background-position:-264px 0}.icon-ok{background-position:-288px 0}.icon-remove{background-position:-312px 0}.icon-zoom-in{background-position:-336px 0}.icon-zoom-out{background-position:-360px 0}.icon-off{background-position:-384px 0}.icon-signal{background-position:-408px 0}.icon-cog{background-position:-432px 0}.icon-trash{background-position:-456px 0}.icon-home{background-position:0 -24px}.icon-file{background-position:-24px -24px}.icon-time{background-position:-48px -24px}.icon-road{background-position:-72px -24px}.icon-download-alt{background-position:-96px -24px}.icon-download{background-position:-120px -24px}.icon-upload{background-position:-144px -24px}.icon-inbox{background-position:-168px -24px}.icon-play-circle{background-position:-192px -24px}.icon-repeat{background-position:-216px -24px}.icon-refresh{background-position:-240px -24px}.icon-list-alt{background-position:-264px -24px}.icon-lock{background-position:-287px -24px}.icon-flag{background-position:-312px -24px}.icon-headphones{background-position:-336px -24px}.icon-volume-off{background-position:-360px -24px}.icon-volume-down{background-position:-384px -24px}.icon-volume-up{background-position:-408px -24px}.icon-qrcode{background-position:-432px -24px}.icon-barcode{background-position:-456px -24px}.icon-tag{background-position:0 -48px}.icon-tags{background-position:-25px -48px}.icon-book{background-position:-48px -48px}.icon-bookmark{background-position:-72px -48px}.icon-print{background-position:-96px -48px}.icon-camera{background-position:-120px -48px}.icon-font{background-position:-144px -48px}.icon-bold{background-position:-167px -48px}.icon-italic{background-position:-192px -48px}.icon-text-height{background-position:-216px -48px}.icon-text-width{background-position:-240px -48px}.icon-align-left{background-position:-264px -48px}.icon-align-center{background-position:-288px -48px}.icon-align-right{background-position:-312px -48px}.icon-align-justify{background-position:-336px -48px}.icon-list{background-position:-360px -48px}.icon-indent-left{background-position:-384px -48px}.icon-indent-right{background-position:-408px -48px}.icon-facetime-video{background-position:-432px -48px}.icon-picture{background-position:-456px -48px}.icon-pencil{background-position:0 -72px}.icon-map-marker{background-position:-24px -72px}.icon-adjust{background-position:-48px -72px}.icon-tint{background-position:-72px -72px}.icon-edit{background-position:-96px -72px}.icon-share{background-position:-120px -72px}.icon-check{background-position:-144px -72px}.icon-move{background-position:-168px -72px}.icon-step-backward{background-position:-192px -72px}.icon-fast-backward{background-position:-216px -72px}.icon-backward{background-position:-240px -72px}.icon-play{background-position:-264px -72px}.icon-pause{background-position:-288px -72px}.icon-stop{background-position:-312px -72px}.icon-forward{background-position:-336px -72px}.icon-fast-forward{background-position:-360px -72px}.icon-step-forward{background-position:-384px -72px}.icon-eject{background-position:-408px -72px}.icon-chevron-left{background-position:-432px -72px}.icon-chevron-right{background-position:-456px -72px}.icon-plus-sign{background-position:0 -96px}.icon-minus-sign{background-position:-24px -96px}.icon-remove-sign{background-position:-48px -96px}.icon-ok-sign{background-position:-72px -96px}.icon-question-sign{background-position:-96px -96px}.icon-info-sign{background-position:-120px -96px}.icon-screenshot{background-position:-144px -96px}.icon-remove-circle{background-position:-168px -96px}.icon-ok-circle{background-position:-192px -96px}.icon-ban-circle{background-position:-216px -96px}.icon-arrow-left{background-position:-240px -96px}.icon-arrow-right{background-position:-264px -96px}.icon-arrow-up{background-position:-289px -96px}.icon-arrow-down{background-position:-312px -96px}.icon-share-alt{background-position:-336px -96px}.icon-resize-full{background-position:-360px -96px}.icon-resize-small{background-position:-384px -96px}.icon-plus{background-position:-408px -96px}.icon-minus{background-position:-433px -96px}.icon-asterisk{background-position:-456px -96px}.icon-exclamation-sign{background-position:0 -120px}.icon-gift{background-position:-24px -120px}.icon-leaf{background-position:-48px -120px}.icon-fire{background-position:-72px -120px}.icon-eye-open{background-position:-96px -120px}.icon-eye-close{background-position:-120px -120px}.icon-warning-sign{background-position:-144px -120px}.icon-plane{background-position:-168px -120px}.icon-calendar{background-position:-192px -120px}.icon-random{width:16px;background-position:-216px -120px}.icon-comment{background-position:-240px -120px}.icon-magnet{background-position:-264px -120px}.icon-chevron-up{background-position:-288px -120px}.icon-chevron-down{background-position:-313px -119px}.icon-retweet{background-position:-336px -120px}.icon-shopping-cart{background-position:-360px -120px}.icon-folder-close{background-position:-384px -120px}.icon-folder-open{width:16px;background-position:-408px -120px}.icon-resize-vertical{background-position:-432px -119px}.icon-resize-horizontal{background-position:-456px -118px}.icon-hdd{background-position:0 -144px}.icon-bullhorn{background-position:-24px -144px}.icon-bell{background-position:-48px -144px}.icon-certificate{background-position:-72px -144px}.icon-thumbs-up{background-position:-96px -144px}.icon-thumbs-down{background-position:-120px -144px}.icon-hand-right{background-position:-144px -144px}.icon-hand-left{background-position:-168px -144px}.icon-hand-up{background-position:-192px -144px}.icon-hand-down{background-position:-216px -144px}.icon-circle-arrow-right{background-position:-240px -144px}.icon-circle-arrow-left{background-position:-264px -144px}.icon-circle-arrow-up{background-position:-288px -144px}.icon-circle-arrow-down{background-position:-312px -144px}.icon-globe{background-position:-336px -144px}.icon-wrench{background-position:-360px -144px}.icon-tasks{background-position:-384px -144px}.icon-filter{background-position:-408px -144px}.icon-briefcase{background-position:-432px -144px}.icon-fullscreen{background-position:-456px -144px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu li>a:hover,.dropdown-menu li>a:focus,.dropdown-submenu:hover>a{color:#fff;text-decoration:none;background-color:#08c;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff;text-decoration:none;background-color:#08c;background-color:#0081c2;background-image:linear-gradient(to bottom,#08c,#0077b3);background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu .disabled>a,.dropdown-menu .disabled>a:hover{color:#999}.dropdown-menu .disabled>a:hover{text-decoration:none;cursor:default;background-color:transparent}.open{*z-index:1000}.open>.dropdown-menu{display:block}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 14px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;*line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #bbb;*border:0;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-bottom-color:#a2a2a2;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover{color:#333;text-decoration:none;background-color:#e6e6e6;*background-color:#d9d9d9;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-color:#e6e6e6;background-color:#d9d9d9 \9;background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-color:#e6e6e6;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:9px 14px;font-size:16px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.btn-large [class^="icon-"]{margin-top:2px}.btn-small{padding:3px 9px;font-size:12px;line-height:18px}.btn-small [class^="icon-"]{margin-top:0}.btn-mini{padding:2px 6px;font-size:11px;line-height:17px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn{border-color:#c5c5c5;border-color:rgba(0,0,0,0.15) rgba(0,0,0,0.15) rgba(0,0,0,0.25)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-image:-moz-linear-gradient(top,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-image:-moz-linear-gradient(top,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-image:-moz-linear-gradient(top,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover{color:#005580;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover{color:#333;text-decoration:none}.btn-group{position:relative;*margin-left:.3em;font-size:0;white-space:nowrap;vertical-align:middle}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1}.btn-toolbar .btn+.btn,.btn-toolbar .btn-group+.btn,.btn-toolbar .btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu{font-size:14px}.btn-group>.btn-mini{font-size:11px}.btn-group>.btn-small{font-size:12px}.btn-group>.btn-large{font-size:16px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-mini .caret,.btn-small .caret,.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.dropup .btn-large .caret{border-top:0;border-bottom:5px solid #000}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical .btn{display:block;float:none;width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical .btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical .btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical .btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical .btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical .btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;color:#c09853;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible;color:#777}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);*zoom:1;-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar-inner:before,.navbar-inner:after{display:table;line-height:0;content:""}.navbar-inner:after{clear:both}.navbar .container{width:auto}.nav-collapse.collapse{height:auto}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777;text-shadow:0 1px 0 #fff}.navbar .brand:hover{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px}.navbar-link{color:#777}.navbar-link:hover{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:5px}.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn{margin-top:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:6px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;width:100%;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px}.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.1),0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.1),0 1px 10px rgba(0,0,0,0.1);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.1),0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:inset 0 1px 0 rgba(0,0,0,0.1),0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 0 rgba(0,0,0,0.1),0 -1px 10px rgba(0,0,0,0.1);box-shadow:inset 0 1px 0 rgba(0,0,0,0.1),0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right;margin-right:0}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777;border-bottom-color:#777}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse{color:#999}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover{color:#fff}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-image:-moz-linear-gradient(top,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb .divider{padding:0 5px;color:#ccc}.breadcrumb .active{color:#999}.pagination{height:40px;margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination ul>li{display:inline}.pagination ul>li>a,.pagination ul>li>span{float:left;padding:0 14px;line-height:38px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination ul>li>a:hover,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5}.pagination ul>.active>a,.pagination ul>.active>span{color:#999;cursor:default}.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover{color:#999;cursor:default;background-color:transparent}.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager a,.pager span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager a:hover{text-decoration:none;background-color:#f5f5f5}.pager .next a,.pager .next span{float:right}.pager .previous a{float:left}.pager .disabled a,.pager .disabled a:hover,.pager .disabled span{color:#999;cursor:default;background-color:#fff}.modal-open .modal .dropdown-menu{z-index:2050}.modal-open .modal .dropdown.open{*z-index:2050}.modal-open .modal .popover{z-index:2060}.modal-open .modal .tooltip{z-index:2080}.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,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:50%;left:50%;z-index:1050;width:560px;margin:-250px 0 0 -280px;overflow:auto;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:50%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.tooltip{position:absolute;z-index:1030;display:block;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{margin-top:-3px}.tooltip.right{margin-left:3px}.tooltip.bottom{margin-top:3px}.tooltip.left{margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;width:236px;padding:1px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-bottom:10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-right:10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0}.popover .arrow,.popover .arrow:after{position:absolute;display:inline-block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow:after{z-index:-1;content:""}.popover.top .arrow{bottom:-10px;left:50%;margin-left:-10px;border-top-color:#fff;border-width:10px 10px 0}.popover.top .arrow:after{bottom:-1px;left:-11px;border-top-color:rgba(0,0,0,0.25);border-width:11px 11px 0}.popover.right .arrow{top:50%;left:-10px;margin-top:-10px;border-right-color:#fff;border-width:10px 10px 10px 0}.popover.right .arrow:after{bottom:-11px;left:-1px;border-right-color:rgba(0,0,0,0.25);border-width:11px 11px 11px 0}.popover.bottom .arrow{top:-10px;left:50%;margin-left:-10px;border-bottom-color:#fff;border-width:0 10px 10px}.popover.bottom .arrow:after{top:-1px;left:-11px;border-bottom-color:rgba(0,0,0,0.25);border-width:0 11px 11px}.popover.left .arrow{top:50%;right:-10px;margin-top:-10px;border-left-color:#fff;border-width:10px 0 10px 10px}.popover.left .arrow:after{right:-1px;bottom:-11px;border-left-color:rgba(0,0,0,0.25);border-width:11px 0 11px 11px}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.label,.badge{font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{padding:1px 4px 2px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding:1px 9px 2px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}a.label:hover,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel .item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel .item>img{display:block;line-height:1}.carousel .active,.carousel .next,.carousel .prev{display:block}.carousel .active{left:0}.carousel .next,.carousel .prev{position:absolute;top:0;width:100%}.carousel .next{left:100%}.carousel .prev{left:-100%}.carousel .next.left,.carousel .prev.right{left:0}.carousel .active.left{left:-100%}.carousel .active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit p{font-size:18px;font-weight:200;line-height:30px;color:inherit}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} 10 | --------------------------------------------------------------------------------