diff --git a/.gitignore b/.gitignore index 7a6ca2580..21259b602 100644 --- a/.gitignore +++ b/.gitignore @@ -55,3 +55,8 @@ /.sass-work grails-app/assets/stylesheets/.sass-cache out + +# Project notes (local only) +CLAUDE.md +*.mv.db +*.trace.db diff --git a/CHANGELOG.md b/CHANGELOG.md index 23ce5eb80..cc690558b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Change Log +## 1.11.0 - 2026-01-02 +### Features +- Added forgot password flow with email-based password reset +- Password reset tokens expire after 30 minutes for security +- Reset link logged to console when email is not configured (useful for development/testing) + +### Technical +- New PasswordResetController with request, sendResetEmail, index, and setPassword actions +- Added passwordResetToken and passwordResetExpiry fields to User domain +- Created email template for password reset notifications +- Added "Forgot Password?" link to login page +- Added translations for forgot password flow in all 18 language files + + ## 0.3.1.RC - 2016-05-18 ### Features - now you dont need to manually parse your SRT files to vtt anymore! the application will do it for you on the fly! diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 000000000..d62be3ba3 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,35 @@ +# Security Policy + +## Supported Versions + +| Version | Supported | +| -------- | ------------------ | +| 1.10.6 | :white_check_mark: | +| < 1.10.6 | :x: | + +## Reporting a Vulnerability + +Please report security issues to dularion@gmail.com + +## Security Advisories + +### CVE-2025-34452 - Subtitle Download Path Traversal and SSRF + +**Severity:** HIGH (CVSS 4.0: 8.7) + +**Affected Versions:** 1.10.0 through 1.10.5 + +**Fixed In:** 1.10.6 (commit b7c8767) + +**Description:** +Streama versions 1.10.0 through 1.10.5 contain a combination of path traversal (CWE-22) and server-side request forgery (CWE-918) vulnerabilities in the subtitle download functionality. These vulnerabilities allow an authenticated attacker to write arbitrary files to the server filesystem by supplying a crafted subtitle download URL and a path traversal sequence in the file name, potentially leading to remote code execution. + +**Mitigation:** +Upgrade to version 1.10.6 or later. + +**Credit:** +Valentin Lobstein (Chocapikk) + +**References:** +- https://github.com/streamaserver/streama/commit/b7c8767 +- https://chocapikk.com/posts/2025/streama-path-traversal-ssrf/ diff --git a/build.gradle b/build.gradle index 9338574d6..05f79bf67 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ buildscript { } repositories { mavenLocal() - maven { url "https://repo.grails.org/grails/core" } + maven { url "https://grails.jfrog.io/grails/core" } } dependencies { classpath "org.grails:grails-gradle-plugin:$grailsVersion" @@ -14,7 +14,7 @@ buildscript { } } -version "1.9.3" +version "1.11.1" group "streama" @@ -38,7 +38,7 @@ ext { repositories { mavenLocal() - maven { url "https://repo.grails.org/grails/core" } + maven { url "https://grails.jfrog.io/grails/core" } } dependencyManagement { @@ -87,7 +87,7 @@ dependencies { // runtime runtime "com.h2database:h2" - runtime 'mysql:mysql-connector-java:5.1.36' + runtime 'mysql:mysql-connector-java:8.0.28' runtime "com.bertramlabs.plugins:asset-pipeline-grails:2.11.6" runtime 'javax.xml.bind:jaxb-api:2.3.0' @@ -95,8 +95,45 @@ dependencies { console "org.grails:grails-console" profile "org.grails.profiles:angular" runtime "org.grails.plugins:async:4.0.0" - compile "org.apache.tika:tika-parsers:1.12" + compile ("org.apache.tika:tika-parsers:1.12") { + exclude group: 'org.ow2.asm', module: 'asm' + exclude group: 'com.healthmarketscience.jackcess' + exclude group: 'net.sourceforge.jmatio' + exclude group: 'org.tukaani', module: 'xz' + exclude group: 'org.apache.pdfbox' + exclude group: 'org.apache.poi' + exclude group: 'org.codelibs', module: 'jhighlight' + exclude group: 'com.pff', module: 'java-libpst' + exclude group: 'com.github.junrar' + exclude group: 'org.apache.cxf' + exclude group: 'org.apache.opennlp' + exclude group: 'de.l3s.boilerpipe' + exclude group: 'com.rometools' + exclude group: 'org.bouncycastle' + exclude group: 'org.ccil.cowan.tagsoup' + exclude group: 'com.googlecode.json-simple' + exclude group: 'com.googlecode.juniversalchardet' + exclude group: 'edu.ucar', module: 'netcdf4' + exclude group: 'edu.ucar', module: 'grib' + exclude group: 'edu.ucar', module: 'cdm' + exclude group: 'edu.ucar', module: 'httpservices' + exclude group: 'org.apache.commons', module: 'commons-csv' + exclude group: 'org.apache.commons', module: 'commons-exec' + exclude group: 'org.apache.sis.storage' + exclude group: 'org.apache.sis.core' + exclude group: 'org.json', module: 'json' + exclude group: 'com.google.code.gson' + exclude group: 'org.apache.commons', module: 'commons-compress' + exclude group: 'org.opengis', module: 'geoapi' + exclude group: 'org.apache.james' + } + // Fix Log4Shell + compile 'org.apache.logging.log4j:log4j-api:2.17.1' + compile 'org.apache.logging.log4j:log4j-core:2.17.1' + compile 'org.apache.logging.log4j:log4j-to-slf4j:2.17.1' + compile 'ch.qos.logback:logback-classic:1.2.8' + compile 'ch.qos.logback:logback-core:1.2.8' // test testCompile "org.grails:grails-plugin-testing" diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 486c9f03f..1ed2eab6a 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -2,6 +2,7 @@ version: "3" services: mysql: + platform: linux/x86_64 image: mysql:5.7 restart: always container_name: mysql diff --git a/docs/convert-audio.md b/docs/convert-audio.md new file mode 100644 index 000000000..4d9025f61 --- /dev/null +++ b/docs/convert-audio.md @@ -0,0 +1,113 @@ +# Converting Audio for Streama Compatibility + +This guide explains how to convert audio tracks in video files for better streaming compatibility. + +## Why Convert Audio? + +Many video files use **EAC3** (Dolby Digital Plus) or **DTS** audio codecs that have poor browser/streaming support. Converting to **AAC** ensures compatibility with web players like Streama. + +## Prerequisites + +- ffmpeg installed (`brew install ffmpeg` on macOS) + +## Step 1: Check Current Audio Format + +```bash +ffprobe -v error -show_entries stream=index,codec_name,codec_type,channels:stream_tags=language -of json "video.mkv" +``` + +Look for the audio stream: +```json +{ + "index": 1, + "codec_name": "eac3", + "codec_type": "audio", + "channels": 6, + "tags": { + "language": "eng" + } +} +``` + +## Step 2: Convert Audio to AAC + +### Basic Conversion (Preserves All Streams) + +```bash +ffmpeg -i "input.mkv" \ + -map 0 \ + -c:v copy \ + -c:a aac -b:a 384k -ac 6 \ + -c:s copy \ + "output.mkv" +``` + +**Explanation:** +- `-map 0` copies all streams from input +- `-c:v copy` keeps video as-is (no re-encoding) +- `-c:a aac -b:a 384k` converts audio to AAC at 384 kbps +- `-ac 6` preserves 5.1 surround (6 channels) +- `-c:s copy` keeps subtitles as-is + +### Stereo Downmix (Smaller File) + +```bash +ffmpeg -i "input.mkv" \ + -map 0 \ + -c:v copy \ + -c:a aac -b:a 192k -ac 2 \ + -c:s copy \ + "output.mkv" +``` + +## Audio Codec Compatibility + +| Codec | Browser Support | Recommendation | +|-------|-----------------|----------------| +| AAC | Excellent | Best for streaming | +| MP3 | Good | Legacy support | +| AC3 (Dolby) | Poor | Convert to AAC | +| EAC3 (DD+) | Poor | Convert to AAC | +| DTS | None | Convert to AAC | +| FLAC | Limited | Convert to AAC | +| Opus | Good | Modern alternative | + +## Recommended Bitrates + +| Channels | Quality | Bitrate | +|----------|---------|---------| +| Stereo (2.0) | Good | 128-192 kbps | +| Stereo (2.0) | High | 192-256 kbps | +| Surround (5.1) | Good | 256-384 kbps | +| Surround (5.1) | High | 384-512 kbps | + +## In-Place Replacement + +To replace the original file: + +```bash +ffmpeg -i "video.mkv" -map 0 -c:v copy -c:a aac -b:a 384k -ac 6 -c:s copy "video.fixed.mkv" +mv -f "video.fixed.mkv" "video.mkv" +``` + +## Batch Processing + +Convert all MKV files in a directory: + +```bash +for f in *.mkv; do + ffmpeg -i "$f" -map 0 -c:v copy -c:a aac -b:a 384k -c:s copy "${f%.mkv}.fixed.mkv" -y + mv -f "${f%.mkv}.fixed.mkv" "$f" +done +``` + +## Troubleshooting + +### Audio out of sync +Add `-async 1` to the ffmpeg command. + +### "Discarding too many packets" +Try adding `-max_muxing_queue_size 1024`. + +### File size increased significantly +Video was re-encoded. Ensure `-c:v copy` is present. diff --git a/docs/extract-subtitles.md b/docs/extract-subtitles.md new file mode 100644 index 000000000..40c4ee8fb --- /dev/null +++ b/docs/extract-subtitles.md @@ -0,0 +1,78 @@ +# Extracting Subtitles from Video Files + +This guide explains how to extract subtitle tracks from MKV video files using ffmpeg. + +## Prerequisites + +- ffmpeg installed (`brew install ffmpeg` on macOS) + +## Step 1: Analyze the Video File + +First, check what subtitle tracks are available: + +```bash +ffprobe -v error -show_entries stream=index,codec_name,codec_type:stream_tags=language,title -of json "video.mkv" +``` + +This outputs JSON showing all streams. Look for entries with `"codec_type": "subtitle"`. + +Example output: +```json +{ + "index": 3, + "codec_name": "subrip", + "codec_type": "subtitle", + "tags": { + "language": "eng", + "title": "English" + } +} +``` + +## Step 2: Extract Subtitles + +### Extract a Single Subtitle Track + +Use the stream index from Step 1: + +```bash +ffmpeg -i "video.mkv" -map 0:3 -c:s srt "output.srt" -y +``` + +- `-map 0:3` selects stream index 3 from input 0 +- `-c:s srt` converts to SRT format +- `-y` overwrites output without prompting + +### Extract Multiple Subtitle Tracks + +Extract multiple tracks in one command: + +```bash +ffmpeg -i "video.mkv" \ + -map 0:3 -c:s srt "video.English.srt" \ + -map 0:35 -c:s srt "video.Swedish.srt" \ + -y +``` + +## Common Subtitle Formats + +| Codec | Extension | Notes | +|-------|-----------|-------| +| subrip | .srt | Most compatible, plain text | +| ass/ssa | .ass | Styled subtitles, converts to SRT | +| hdmv_pgs | .sup | Blu-ray image subs, cannot convert to text | +| dvd_subtitle | .sub | DVD image subs, cannot convert to text | + +## Tips + +- **Finding language codes**: Common codes are `eng` (English), `swe` (Swedish), `ger` (German), `fre` (French) +- **Forced subtitles**: These only show when foreign languages are spoken (marked as "forced" in title) +- **SDH subtitles**: Include descriptions for deaf/hard of hearing viewers + +## Troubleshooting + +### "Stream not found" +The stream index may have changed. Re-run ffprobe to verify. + +### Image-based subtitles +PGS/VOB subtitles are images, not text. You'll need OCR tools like SubtitleEdit to convert them. diff --git a/docs/plans/2026-01-03-audio-transcoding-design.md b/docs/plans/2026-01-03-audio-transcoding-design.md new file mode 100644 index 000000000..37d3097e6 --- /dev/null +++ b/docs/plans/2026-01-03-audio-transcoding-design.md @@ -0,0 +1,233 @@ +# On-the-fly Audio Transcoding Feature Design + +## Overview + +Add on-the-fly audio transcoding to Streama to convert incompatible audio codecs (EAC3, AC3) to browser-compatible AAC format. FFmpeg is optional and the feature is disabled if not installed. + +## Architecture + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ STREAMA SERVER │ +├─────────────────────────────────────────────────────────────────┤ +│ Settings │ +│ ├── ffmpegPath: auto-detected or manual │ +│ ├── ffprobePath: auto-detected or manual │ +│ ├── transcodingEnabled: boolean (default false) │ +│ └── transcodeCacheDir: path for cached audio files │ +├─────────────────────────────────────────────────────────────────┤ +│ File Domain (extended) │ +│ ├── audioCodec: String (eac3, aac, ac3, etc.) │ +│ ├── needsTranscoding: Boolean │ +│ └── transcodedAudioPath: String (path to cached .aac) │ +├─────────────────────────────────────────────────────────────────┤ +│ New Services │ +│ ├── FfmpegService - detect, probe, transcode │ +│ └── TranscodingService - orchestrate, queue, cache mgmt │ +├─────────────────────────────────────────────────────────────────┤ +│ Cache Directory │ +│ └── {uploadDir}/transcode-cache/ │ +│ └── {sha256}.aac - transcoded audio streams │ +└─────────────────────────────────────────────────────────────────┘ +``` + +## User Flows + +### Flow 1: Admin enables transcoding +1. Admin goes to Settings +2. System auto-detects FFmpeg in PATH +3. If found, shows "FFmpeg detected at /usr/bin/ffmpeg" +4. If not found, shows manual path input with install instructions +5. Admin enables "Audio Transcoding" +6. System validates FFmpeg works + +### Flow 2: File added to video +1. User adds file to Movie/Episode (upload, local file, or existing) +2. If transcoding enabled, system probes file with ffprobe +3. Stores audioCodec in File domain +4. Sets needsTranscoding = true if codec is incompatible (eac3, ac3, dts) + +### Flow 3: User plays video needing transcoding +1. User clicks play on video +2. Frontend requests video +3. If file.needsTranscoding && !file.transcodedAudioPath: + - Return 202 Accepted with transcoding status + - Frontend shows "Preparing audio..." spinner + - Server transcodes audio only to AAC (ffmpeg -vn -c:a aac) + - Stores result in cache directory + - Updates file.transcodedAudioPath +4. Once ready, serve video with muxed transcoded audio +5. Subsequent plays use cached audio instantly + +### Flow 4: Admin pre-transcodes +1. Admin goes to Transcoding admin page +2. Sees list of files needing transcoding +3. Can click "Pre-transcode All" or individual files +4. Background job processes queue +5. Status updates shown in UI + +## Technical Implementation + +### New Settings +```groovy +[settingsKey: 'FFmpeg Path', name: 'ffmpeg_path', settingsType: 'string', value: ''] +[settingsKey: 'FFprobe Path', name: 'ffprobe_path', settingsType: 'string', value: ''] +[settingsKey: 'Enable Audio Transcoding', name: 'transcoding_enabled', settingsType: 'boolean', value: 'false'] +``` + +### File Domain Changes +```groovy +class File { + // ... existing fields ... + String audioCodec // detected codec (aac, eac3, ac3, dts, etc.) + Boolean needsTranscoding // true if browser-incompatible + String transcodedAudioPath // path to cached .aac file +} +``` + +### FfmpegService +```groovy +class FfmpegService { + // Auto-detect ffmpeg/ffprobe in PATH + Map detectFfmpeg() + + // Probe file for audio codec + String probeAudioCodec(String filePath) + + // Check if codec needs transcoding + boolean needsTranscoding(String codec) + + // Transcode audio only to AAC + String transcodeAudioToAac(String inputPath, String outputPath) + + // Mux original video with transcoded audio on-the-fly + void streamMuxedVideo(OutputStream output, String videoPath, String audioPath, long rangeStart, long rangeEnd) +} +``` + +### TranscodingService +```groovy +class TranscodingService { + // Get cache path for file + String getCachePath(File file) + + // Check if transcoded version exists + boolean hasTranscodedAudio(File file) + + // Transcode file (blocking) + File transcodeFile(File file) + + // Queue file for transcoding + void queueForTranscoding(File file) + + // Get transcoding status + Map getTranscodingStatus(File file) + + // Pre-transcode all pending files + void transcodeAllPending() +} +``` + +### FileController Changes +```groovy +def serve() { + // ... existing auth checks ... + + if (file needs transcoding) { + if (no cached audio) { + // Return 202 with status, trigger transcoding + return [status: 'transcoding', progress: transcodingService.getProgress(file)] + } + // Serve muxed video+audio + ffmpegService.streamMuxedVideo(response.outputStream, videoPath, transcodedAudioPath, rangeStart, rangeEnd) + } else { + // Existing direct serve logic + } +} +``` + +### New TranscodingController +```groovy +class TranscodingController { + // Get status of FFmpeg detection + def status() + + // Get list of files needing transcoding + def pending() + + // Trigger transcoding for a file + def transcode(File file) + + // Trigger transcoding for all pending + def transcodeAll() + + // Get progress of current transcoding + def progress(File file) +} +``` + +### Frontend Changes + +#### Player Service +- Check for 202 response when loading video +- Show transcoding spinner with progress +- Poll for completion +- Auto-reload video when ready + +#### Settings UI +- New section for "Audio Transcoding" +- FFmpeg status indicator (detected/not found) +- Manual path override +- Enable/disable toggle +- Install instructions link + +#### Admin Transcoding Page (optional) +- List of files needing transcoding +- Current queue status +- Pre-transcode button + +## Browser-compatible vs Incompatible Codecs + +**Compatible (no transcoding needed):** +- aac +- mp3 +- opus +- vorbis +- flac + +**Incompatible (needs transcoding):** +- eac3 (Dolby Digital Plus) +- ac3 (Dolby Digital) +- dts +- truehd +- pcm_* + +## FFmpeg Commands + +**Probe audio codec:** +```bash +ffprobe -v quiet -select_streams a:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 input.mkv +``` + +**Extract and transcode audio to AAC:** +```bash +ffmpeg -i input.mkv -vn -c:a aac -b:a 384k output.aac +``` + +**Mux video with new audio (for playback):** +```bash +ffmpeg -i input.mkv -i transcoded.aac -map 0:v -map 1:a -c:v copy -c:a copy -f mp4 -movflags frag_keyframe+empty_moov pipe:1 +``` + +## Implementation Order + +1. Add File domain fields + migration +2. Create Settings entries +3. Implement FfmpegService (detect, probe, transcode) +4. Implement TranscodingService (orchestrate, cache) +5. Modify VideoService.addLocalFile to probe on attach +6. Modify FileController.serve for transcoded playback +7. Create TranscodingController +8. Add settings UI for FFmpeg config +9. Add player transcoding spinner +10. Add admin transcoding UI (optional) diff --git a/gradle.properties b/gradle.properties index 4f1bea443..3a6d7f267 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,2 @@ grailsVersion=3.2.6 -gradleWrapperVersion=3.0 +gradleWrapperVersion=3.1 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 941144813..5765522ba 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 99f0c5880..f68c80a31 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.0-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-3.1-all.zip diff --git a/grails-app/assets/bower/bootstrap/bootstrap.css b/grails-app/assets/bower/bootstrap/bootstrap.css index 42c79d6e4..e5d8eaaaf 100644 --- a/grails-app/assets/bower/bootstrap/bootstrap.css +++ b/grails-app/assets/bower/bootstrap/bootstrap.css @@ -4214,7 +4214,7 @@ select[multiple].input-group-sm > .input-group-btn > .btn { .navbar-static-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { padding-right: 0; - padding-left: 0; + padding-left: 1em; } } .navbar-fixed-top .navbar-collapse, diff --git a/grails-app/assets/bower/bootstrap/bootstrap.custom.css b/grails-app/assets/bower/bootstrap/bootstrap.custom.css index b1f8f6e1f..ba3a2ef3d 100644 --- a/grails-app/assets/bower/bootstrap/bootstrap.custom.css +++ b/grails-app/assets/bower/bootstrap/bootstrap.custom.css @@ -8,4 +8,4 @@ * Bootstrap v3.3.5 (http://getbootstrap.com) * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:15px;line-height:1.42857143;color:#ffffff;background-color:#222222}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#0ce3ac;text-decoration:none}a:hover,a:focus{color:#0ce3ac;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:2px;line-height:1.42857143;background-color:#222222;border:1px solid #464545;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:21px;margin-bottom:21px;border:0;border-top:1px solid #464545}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#999999}h1,.h1,h2,.h2,h3,.h3{margin-top:21px;margin-bottom:10.5px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10.5px;margin-bottom:10.5px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:39px}h2,.h2{font-size:32px}h3,.h3{font-size:26px}h4,.h4{font-size:19px}h5,.h5{font-size:15px}h6,.h6{font-size:13px}p{margin:0 0 10.5px}.lead{margin-bottom:21px;font-size:17px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:22.5px}}small,.small{font-size:86%}mark,.mark{background-color:#f39c12;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#999999}.text-primary{color:#375a7f}a.text-primary:hover,a.text-primary:focus{color:#28415b}.text-success{color:#ffffff}a.text-success:hover,a.text-success:focus{color:#e6e6e6}.text-info{color:#ffffff}a.text-info:hover,a.text-info:focus{color:#e6e6e6}.text-warning{color:#ffffff}a.text-warning:hover,a.text-warning:focus{color:#e6e6e6}.text-danger{color:#ffffff}a.text-danger:hover,a.text-danger:focus{color:#e6e6e6}.bg-primary{color:#fff;background-color:#375a7f}a.bg-primary:hover,a.bg-primary:focus{background-color:#28415b}.bg-success{background-color:#00bc8c}a.bg-success:hover,a.bg-success:focus{background-color:#008966}.bg-info{background-color:#3498db}a.bg-info:hover,a.bg-info:focus{background-color:#217dbb}.bg-warning{background-color:#f39c12}a.bg-warning:hover,a.bg-warning:focus{background-color:#c87f0a}.bg-danger{background-color:#e74c3c}a.bg-danger:hover,a.bg-danger:focus{background-color:#d62c1a}.page-header{padding-bottom:9.5px;margin:42px 0 21px;border-bottom:1px solid transparent}ul,ol{margin-top:0;margin-bottom:10.5px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:21px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10.5px 21px;margin:0 0 21px;font-size:18.75px;border-left:5px solid #464545}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#999999}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #464545;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:21px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#ffffff;background-color:#333333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:10px;margin:0 0 10.5px;font-size:14px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#303030;background-color:#ebebeb;border:1px solid #cccccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0%}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0%}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0%}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0%}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#999999;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:21px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #464545}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #464545}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #464545}.table .table{background-color:#222222}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #464545}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #464545}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#3d3d3d}.table-hover>tbody>tr:hover{background-color:#464545}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#464545}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#393838}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#00bc8c}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#00a379}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#3498db}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#258cd1}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#f39c12}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#e08e0b}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#e74c3c}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#e43725}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15.75px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #464545}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:21px;font-size:22.5px;line-height:inherit;color:#ffffff;border:0;border-bottom:1px solid transparent}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:11px;font-size:15px;line-height:1.42857143;color:#464545}.form-control{display:block;width:100%;height:45px;padding:10px 15px;font-size:15px;line-height:1.42857143;color:#464545;background-color:#ffffff;background-image:none;border:1px solid #f1f1f1;border-radius:4px;-webkit-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-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#ffffff;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(255,255,255,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(255,255,255,0.6)}.form-control::-moz-placeholder{color:#999999;opacity:1}.form-control:-ms-input-placeholder{color:#999999}.form-control::-webkit-input-placeholder{color:#999999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#ebebeb;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:45px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:35px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:66px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:21px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:11px;padding-bottom:11px;margin-bottom:0;min-height:36px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:35px;padding:6px 9px;font-size:13px;line-height:1.5;border-radius:3px}select.input-sm{height:35px;line-height:35px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:35px;padding:6px 9px;font-size:13px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:35px;line-height:35px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:35px;min-height:34px;padding:7px 9px;font-size:13px;line-height:1.5}.input-lg{height:66px;padding:18px 27px;font-size:19px;line-height:1.3333333;border-radius:6px}select.input-lg{height:66px;line-height:66px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:66px;padding:18px 27px;font-size:19px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:66px;line-height:66px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:66px;min-height:40px;padding:19px 27px;font-size:19px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:56.25px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:45px;height:45px;line-height:45px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:66px;height:66px;line-height:66px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:35px;height:35px;line-height:35px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#ffffff}.has-success .form-control{border-color:#ffffff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-success .input-group-addon{color:#ffffff;border-color:#ffffff;background-color:#00bc8c}.has-success .form-control-feedback{color:#ffffff}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#ffffff}.has-warning .form-control{border-color:#ffffff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-warning .input-group-addon{color:#ffffff;border-color:#ffffff;background-color:#f39c12}.has-warning .form-control-feedback{color:#ffffff}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#ffffff}.has-error .form-control{border-color:#ffffff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-error .input-group-addon{color:#ffffff;border-color:#ffffff;background-color:#e74c3c}.has-error .form-control-feedback{color:#ffffff}.has-feedback label~.form-control-feedback{top:26px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#ffffff}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:11px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:32px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:11px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:24.9999994px;font-size:19px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:7px;font-size:13px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:10px 15px;font-size:15px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#ffffff;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#ffffff;background-color:#464545;border-color:#464545}.btn-default:focus,.btn-default.focus{color:#ffffff;background-color:#2c2c2c;border-color:#060606}.btn-default:hover{color:#ffffff;background-color:#2c2c2c;border-color:#272727}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#ffffff;background-color:#2c2c2c;border-color:#272727}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#ffffff;background-color:#1a1a1a;border-color:#060606}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#464545;border-color:#464545}.btn-default .badge{color:#464545;background-color:#ffffff}.btn-primary{color:#ffffff;background-color:#375a7f;border-color:#375a7f}.btn-primary:focus,.btn-primary.focus{color:#ffffff;background-color:#28415b;border-color:#101b26}.btn-primary:hover{color:#ffffff;background-color:#28415b;border-color:#253c54}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#ffffff;background-color:#28415b;border-color:#253c54}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#ffffff;background-color:#1d2f43;border-color:#101b26}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#375a7f;border-color:#375a7f}.btn-primary .badge{color:#375a7f;background-color:#ffffff}.btn-success{color:#ffffff;background-color:#00bc8c;border-color:#00bc8c}.btn-success:focus,.btn-success.focus{color:#ffffff;background-color:#008966;border-color:#003d2d}.btn-success:hover{color:#ffffff;background-color:#008966;border-color:#007f5e}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#ffffff;background-color:#008966;border-color:#007f5e}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#ffffff;background-color:#00654b;border-color:#003d2d}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#00bc8c;border-color:#00bc8c}.btn-success .badge{color:#00bc8c;background-color:#ffffff}.btn-info{color:#ffffff;background-color:#3498db;border-color:#3498db}.btn-info:focus,.btn-info.focus{color:#ffffff;background-color:#217dbb;border-color:#16527a}.btn-info:hover{color:#ffffff;background-color:#217dbb;border-color:#2077b2}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#ffffff;background-color:#217dbb;border-color:#2077b2}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#ffffff;background-color:#1c699d;border-color:#16527a}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#3498db;border-color:#3498db}.btn-info .badge{color:#3498db;background-color:#ffffff}.btn-warning{color:#ffffff;background-color:#f39c12;border-color:#f39c12}.btn-warning:focus,.btn-warning.focus{color:#ffffff;background-color:#c87f0a;border-color:#7f5006}.btn-warning:hover{color:#ffffff;background-color:#c87f0a;border-color:#be780a}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#ffffff;background-color:#c87f0a;border-color:#be780a}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#ffffff;background-color:#a66908;border-color:#7f5006}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f39c12;border-color:#f39c12}.btn-warning .badge{color:#f39c12;background-color:#ffffff}.btn-danger{color:#ffffff;background-color:#e74c3c;border-color:#e74c3c}.btn-danger:focus,.btn-danger.focus{color:#ffffff;background-color:#d62c1a;border-color:#921e12}.btn-danger:hover{color:#ffffff;background-color:#d62c1a;border-color:#cd2a19}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#ffffff;background-color:#d62c1a;border-color:#cd2a19}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#ffffff;background-color:#b62516;border-color:#921e12}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#e74c3c;border-color:#e74c3c}.btn-danger .badge{color:#e74c3c;background-color:#ffffff}.btn-link{color:#0ce3ac;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#0ce3ac;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999999;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:18px 27px;font-size:19px;line-height:1.3333333;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:6px 9px;font-size:13px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:13px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;-o-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:0.35s;-o-transition-duration:0.35s;transition-duration:0.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.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;font-size:15px;text-align:left;background-color:#303030;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:#464545}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#ebebeb;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#ffffff;background-color:#375a7f}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#ffffff;text-decoration:none;outline:0;background-color:#375a7f}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:13px;line-height:1.42857143;color:#999999;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:66px;padding:18px 27px;font-size:19px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:66px;line-height:66px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:35px;padding:6px 9px;font-size:13px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:35px;line-height:35px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:10px 15px;font-size:15px;font-weight:normal;line-height:1;color:#464545;text-align:center;background-color:#464545;border:1px solid transparent;border-radius:4px}.input-group-addon.input-sm{padding:6px 9px;font-size:13px;border-radius:3px}.input-group-addon.input-lg{padding:18px 27px;font-size:19px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#303030}.nav>li.disabled>a{color:#605e5e}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#605e5e;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#303030;border-color:#0ce3ac}.nav .nav-divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #464545}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#464545 #464545 #464545}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#00bc8c;background-color:#222222;border:1px solid #464545;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ebebeb}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ebebeb;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#222222}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#ffffff;background-color:#375a7f}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ebebeb}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ebebeb;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#222222}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:60px;margin-bottom:21px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:19.5px 15px;font-size:19px;line-height:21px;height:60px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:13px;margin-bottom:13px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:9.75px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:21px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:21px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:19.5px;padding-bottom:19.5px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:7.5px;margin-bottom:7.5px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:7.5px;margin-bottom:7.5px}.navbar-btn.btn-sm{margin-top:12.5px;margin-bottom:12.5px}.navbar-btn.btn-xs{margin-top:19px;margin-bottom:19px}.navbar-text{margin-top:19.5px;margin-bottom:19.5px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#375a7f;border-color:transparent}.navbar-default .navbar-brand{color:#ffffff}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#00bc8c;background-color:transparent}.navbar-default .navbar-text{color:#777777}.navbar-default .navbar-nav>li>a{color:#ffffff}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#00bc8c;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#ffffff;background-color:#28415b}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#cccccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#28415b}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#28415b}.navbar-default .navbar-toggle .icon-bar{background-color:#ffffff}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:transparent}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#28415b;color:#ffffff}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#ffffff}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#00bc8c;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#28415b}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#cccccc;background-color:transparent}}.navbar-default .navbar-link{color:#ffffff}.navbar-default .navbar-link:hover{color:#00bc8c}.navbar-default .btn-link{color:#ffffff}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#00bc8c}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#cccccc}.navbar-inverse{background-color:#00bc8c;border-color:transparent}.navbar-inverse .navbar-brand{color:#ffffff}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#375a7f;background-color:transparent}.navbar-inverse .navbar-text{color:#ffffff}.navbar-inverse .navbar-nav>li>a{color:#ffffff}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#375a7f;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#ffffff;background-color:#00a379}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#aaaaaa;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#008966}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#008966}.navbar-inverse .navbar-toggle .icon-bar{background-color:#ffffff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#009871}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#00a379;color:#ffffff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#ffffff}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#375a7f;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#00a379}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#aaaaaa;background-color:transparent}}.navbar-inverse .navbar-link{color:#ffffff}.navbar-inverse .navbar-link:hover{color:#375a7f}.navbar-inverse .btn-link{color:#ffffff}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#375a7f}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#aaaaaa}.breadcrumb{padding:8px 15px;margin-bottom:21px;list-style:none;background-color:#464545;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ffffff}.breadcrumb>.active{color:#999999}.pagination{display:inline-block;padding-left:0;margin:21px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:10px 15px;line-height:1.42857143;text-decoration:none;color:#ffffff;background-color:#00bc8c;border:1px solid transparent;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{z-index:3;color:#ffffff;background-color:#00dba3;border-color:transparent}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#ffffff;background-color:#00dba3;border-color:transparent;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#ffffff;background-color:#007053;border-color:transparent;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:18px 27px;font-size:19px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:6px 9px;font-size:13px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:21px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#00bc8c;border:1px solid transparent;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#00dba3}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#dddddd;background-color:#00bc8c;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#ffffff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#ffffff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#464545}.label-default[href]:hover,.label-default[href]:focus{background-color:#2c2c2c}.label-primary{background-color:#375a7f}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#28415b}.label-success{background-color:#00bc8c}.label-success[href]:hover,.label-success[href]:focus{background-color:#008966}.label-info{background-color:#3498db}.label-info[href]:hover,.label-info[href]:focus{background-color:#217dbb}.label-warning{background-color:#f39c12}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#c87f0a}.label-danger{background-color:#e74c3c}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#d62c1a}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:13px;font-weight:bold;color:#ffffff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#464545;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#375a7f;background-color:#ffffff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#303030}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:23px;font-weight:200}.jumbotron>hr{border-top-color:#161616}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:68px}}.thumbnail{display:block;padding:2px;margin-bottom:21px;line-height:1.42857143;background-color:#222222;border:1px solid #464545;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#0ce3ac}.thumbnail .caption{padding:9px;color:#ffffff}.alert{padding:15px;margin-bottom:21px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#00bc8c;border-color:#00bc8c;color:#ffffff}.alert-success hr{border-top-color:#00a379}.alert-success .alert-link{color:#e6e6e6}.alert-info{background-color:#3498db;border-color:#3498db;color:#ffffff}.alert-info hr{border-top-color:#258cd1}.alert-info .alert-link{color:#e6e6e6}.alert-warning{background-color:#f39c12;border-color:#f39c12;color:#ffffff}.alert-warning hr{border-top-color:#e08e0b}.alert-warning .alert-link{color:#e6e6e6}.alert-danger{background-color:#e74c3c;border-color:#e74c3c;color:#ffffff}.alert-danger hr{border-top-color:#e43725}.alert-danger .alert-link{color:#e6e6e6}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:21px;margin-bottom:21px;background-color:#ebebeb;border-radius:4px;-webkit-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:13px;line-height:21px;color:#ffffff;text-align:center;background-color:#375a7f;-webkit-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-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#00bc8c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#3498db}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#f39c12}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#e74c3c}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#303030;border:1px solid #464545}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#0ce3ac}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#0bcb9a}a.list-group-item:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{text-decoration:none;color:#0ce3ac;background-color:transparent}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#ebebeb;color:#999999;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#999999}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#ffffff;background-color:#375a7f;border-color:#375a7f}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#a8c0da}.list-group-item-success{color:#ffffff;background-color:#00bc8c}a.list-group-item-success,button.list-group-item-success{color:#ffffff}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#ffffff;background-color:#00a379}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-info{color:#ffffff;background-color:#3498db}a.list-group-item-info,button.list-group-item-info{color:#ffffff}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#ffffff;background-color:#258cd1}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-warning{color:#ffffff;background-color:#f39c12}a.list-group-item-warning,button.list-group-item-warning{color:#ffffff}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#ffffff;background-color:#e08e0b}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-danger{color:#ffffff;background-color:#e74c3c}a.list-group-item-danger,button.list-group-item-danger{color:#ffffff}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#ffffff;background-color:#e43725}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:21px;background-color:#303030;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:17px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#464545;border-top:1px solid #464545;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #464545}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:21px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #464545}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #464545}.panel-default{border-color:#464545}.panel-default>.panel-heading{color:#ffffff;background-color:#303030;border-color:#464545}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#464545}.panel-default>.panel-heading .badge{color:#303030;background-color:#ffffff}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#464545}.panel-primary{border-color:#375a7f}.panel-primary>.panel-heading{color:#ffffff;background-color:#375a7f;border-color:#375a7f}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#375a7f}.panel-primary>.panel-heading .badge{color:#375a7f;background-color:#ffffff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#375a7f}.panel-success{border-color:#00bc8c}.panel-success>.panel-heading{color:#ffffff;background-color:#00bc8c;border-color:#00bc8c}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#00bc8c}.panel-success>.panel-heading .badge{color:#00bc8c;background-color:#ffffff}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#00bc8c}.panel-info{border-color:#3498db}.panel-info>.panel-heading{color:#ffffff;background-color:#3498db;border-color:#3498db}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#3498db}.panel-info>.panel-heading .badge{color:#3498db;background-color:#ffffff}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#3498db}.panel-warning{border-color:#f39c12}.panel-warning>.panel-heading{color:#ffffff;background-color:#f39c12;border-color:#f39c12}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#f39c12}.panel-warning>.panel-heading .badge{color:#f39c12;background-color:#ffffff}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#f39c12}.panel-danger{border-color:#e74c3c}.panel-danger>.panel-heading{color:#ffffff;background-color:#e74c3c;border-color:#e74c3c}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#e74c3c}.panel-danger>.panel-heading .badge{color:#e74c3c;background-color:#ffffff}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#e74c3c}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#303030;border:1px solid transparent;border-radius:4px;-webkit-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-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:22.5px;font-weight:bold;line-height:1;color:#ffffff;text-shadow:none;opacity:0.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#ffffff;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#303030;border:1px solid #999999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.7;filter:alpha(opacity=70)}.modal-header{padding:15px;border-bottom:1px solid #464545;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{padding:20px;text-align:right;border-top:1px solid #464545}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:13px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;background-color:#000000;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-width:5px 5px 0;border-top-color:#000000}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:15px;background-color:#303030;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:15px;background-color:#282828;border-bottom:1px solid #1c1c1c;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#666666;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#303030}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#666666;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#303030}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#666666;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#303030}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#666666;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#303030;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:0.5;filter:alpha(opacity=50);font-size:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.5)), to(rgba(0,0,0,0.0001)));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.0001)), to(rgba(0,0,0,0.5)));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #ffffff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#ffffff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.navbar{border-width:0}.navbar-default .badge{background-color:#fff;color:#375a7f}.navbar-inverse .badge{background-color:#fff;color:#00bc8c}.navbar-brand{line-height:1}.navbar-form .form-control{background-color:white}.navbar-form .form-control:focus{border-color:white}.btn{border-width:2px}.btn:active{-webkit-box-shadow:none;box-shadow:none}.btn-group.open .dropdown-toggle{-webkit-box-shadow:none;box-shadow:none}.text-primary,.text-primary:hover{color:#4673a3}.text-success,.text-success:hover{color:#00bc8c}.text-danger,.text-danger:hover{color:#e74c3c}.text-warning,.text-warning:hover{color:#f39c12}.text-info,.text-info:hover{color:#3498db}table a:not(.btn),.table a:not(.btn){text-decoration:underline}table .dropdown-menu a,.table .dropdown-menu a{text-decoration:none}table .success,.table .success,table .warning,.table .warning,table .danger,.table .danger,table .info,.table .info{color:#fff}table .success>th>a,.table .success>th>a,table .warning>th>a,.table .warning>th>a,table .danger>th>a,.table .danger>th>a,table .info>th>a,.table .info>th>a,table .success>td>a,.table .success>td>a,table .warning>td>a,.table .warning>td>a,table .danger>td>a,.table .danger>td>a,table .info>td>a,.table .info>td>a,table .success>a,.table .success>a,table .warning>a,.table .warning>a,table .danger>a,.table .danger>a,table .info>a,.table .info>a{color:#fff}table>thead>tr>th,.table>thead>tr>th,table>tbody>tr>th,.table>tbody>tr>th,table>tfoot>tr>th,.table>tfoot>tr>th,table>thead>tr>td,.table>thead>tr>td,table>tbody>tr>td,.table>tbody>tr>td,table>tfoot>tr>td,.table>tfoot>tr>td{border:none}table-bordered>thead>tr>th,.table-bordered>thead>tr>th,table-bordered>tbody>tr>th,.table-bordered>tbody>tr>th,table-bordered>tfoot>tr>th,.table-bordered>tfoot>tr>th,table-bordered>thead>tr>td,.table-bordered>thead>tr>td,table-bordered>tbody>tr>td,.table-bordered>tbody>tr>td,table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #464545}input,textarea{color:#464545}.form-control,input,textarea{border:2px hidden transparent;-webkit-box-shadow:none;box-shadow:none}.form-control:focus,input:focus,textarea:focus{-webkit-box-shadow:none;box-shadow:none}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label,.has-warning .form-control-feedback{color:#f39c12}.has-warning .form-control,.has-warning .form-control:focus{-webkit-box-shadow:none;box-shadow:none}.has-warning .input-group-addon{border-color:#f39c12}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label,.has-error .form-control-feedback{color:#e74c3c}.has-error .form-control,.has-error .form-control:focus{-webkit-box-shadow:none;box-shadow:none}.has-error .input-group-addon{border-color:#e74c3c}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label,.has-success .form-control-feedback{color:#00bc8c}.has-success .form-control,.has-success .form-control:focus{-webkit-box-shadow:none;box-shadow:none}.has-success .input-group-addon{border-color:#00bc8c}.input-group-addon{color:#ffffff}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{border-color:#464545}.nav-tabs>li>a,.nav-pills>li>a{color:#fff}.pager a,.pager a:hover{color:#fff}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{background-color:#007053}.breadcrumb a{color:#fff}.close{text-decoration:none;text-shadow:none;opacity:0.4}.close:hover,.close:focus{opacity:1}.alert .alert-link{color:#fff;text-decoration:underline}.progress{height:10px;-webkit-box-shadow:none;box-shadow:none}.progress .progress-bar{font-size:10px;line-height:10px}.well{-webkit-box-shadow:none;box-shadow:none}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{border-color:#464545}a.list-group-item-success.active{background-color:#00bc8c}a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{background-color:#00a379}a.list-group-item-warning.active{background-color:#f39c12}a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{background-color:#e08e0b}a.list-group-item-danger.active{background-color:#e74c3c}a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{background-color:#e43725}.popover{color:#ffffff}.panel-default>.panel-heading{background-color:#464545} \ No newline at end of file + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:15px;line-height:1.42857143;color:#ffffff;background-color:#222222}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#0ce3ac;text-decoration:none}a:hover,a:focus{color:#0ce3ac;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:2px;line-height:1.42857143;background-color:#222222;border:1px solid #464545;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:21px;margin-bottom:21px;border:0;border-top:1px solid #464545}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#999999}h1,.h1,h2,.h2,h3,.h3{margin-top:21px;margin-bottom:10.5px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10.5px;margin-bottom:10.5px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:39px}h2,.h2{font-size:32px}h3,.h3{font-size:26px}h4,.h4{font-size:19px}h5,.h5{font-size:15px}h6,.h6{font-size:13px}p{margin:0 0 10.5px}.lead{margin-bottom:21px;font-size:17px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:22.5px}}small,.small{font-size:86%}mark,.mark{background-color:#f39c12;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#999999}.text-primary{color:#375a7f}a.text-primary:hover,a.text-primary:focus{color:#28415b}.text-success{color:#ffffff}a.text-success:hover,a.text-success:focus{color:#e6e6e6}.text-info{color:#ffffff}a.text-info:hover,a.text-info:focus{color:#e6e6e6}.text-warning{color:#ffffff}a.text-warning:hover,a.text-warning:focus{color:#e6e6e6}.text-danger{color:#ffffff}a.text-danger:hover,a.text-danger:focus{color:#e6e6e6}.bg-primary{color:#fff;background-color:#375a7f}a.bg-primary:hover,a.bg-primary:focus{background-color:#28415b}.bg-success{background-color:#00bc8c}a.bg-success:hover,a.bg-success:focus{background-color:#008966}.bg-info{background-color:#3498db}a.bg-info:hover,a.bg-info:focus{background-color:#217dbb}.bg-warning{background-color:#f39c12}a.bg-warning:hover,a.bg-warning:focus{background-color:#c87f0a}.bg-danger{background-color:#e74c3c}a.bg-danger:hover,a.bg-danger:focus{background-color:#d62c1a}.page-header{padding-bottom:9.5px;margin:42px 0 21px;border-bottom:1px solid transparent}ul,ol{margin-top:0;margin-bottom:10.5px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:21px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10.5px 21px;margin:0 0 21px;font-size:18.75px;border-left:5px solid #464545}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#999999}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #464545;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:21px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#ffffff;background-color:#333333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:10px;margin:0 0 10.5px;font-size:14px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#303030;background-color:#ebebeb;border:1px solid #cccccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0%}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0%}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0%}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0%}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#999999;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:21px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #464545}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #464545}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #464545}.table .table{background-color:#222222}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #464545}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #464545}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#3d3d3d}.table-hover>tbody>tr:hover{background-color:#464545}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#464545}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#393838}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#00bc8c}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#00a379}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#3498db}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#258cd1}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#f39c12}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#e08e0b}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#e74c3c}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#e43725}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15.75px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #464545}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:21px;font-size:22.5px;line-height:inherit;color:#ffffff;border:0;border-bottom:1px solid transparent}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:11px;font-size:15px;line-height:1.42857143;color:#464545}.form-control{display:block;width:100%;height:45px;padding:10px 15px;font-size:15px;line-height:1.42857143;color:#464545;background-color:#ffffff;background-image:none;border:1px solid #f1f1f1;border-radius:4px;-webkit-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-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#ffffff;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(255,255,255,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(255,255,255,0.6)}.form-control::-moz-placeholder{color:#999999;opacity:1}.form-control:-ms-input-placeholder{color:#999999}.form-control::-webkit-input-placeholder{color:#999999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#ebebeb;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:45px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:35px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:66px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:21px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:11px;padding-bottom:11px;margin-bottom:0;min-height:36px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:35px;padding:6px 9px;font-size:13px;line-height:1.5;border-radius:3px}select.input-sm{height:35px;line-height:35px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:35px;padding:6px 9px;font-size:13px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:35px;line-height:35px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:35px;min-height:34px;padding:7px 9px;font-size:13px;line-height:1.5}.input-lg{height:66px;padding:18px 27px;font-size:19px;line-height:1.3333333;border-radius:6px}select.input-lg{height:66px;line-height:66px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:66px;padding:18px 27px;font-size:19px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:66px;line-height:66px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:66px;min-height:40px;padding:19px 27px;font-size:19px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:56.25px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:45px;height:45px;line-height:3.6em;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:66px;height:66px;line-height:66px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:35px;height:35px;line-height:35px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#ffffff}.has-success .form-control{border-color:#ffffff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-success .input-group-addon{color:#ffffff;border-color:#ffffff;background-color:#00bc8c}.has-success .form-control-feedback{color:#ffffff}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#ffffff}.has-warning .form-control{border-color:#ffffff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-warning .input-group-addon{color:#ffffff;border-color:#ffffff;background-color:#f39c12}.has-warning .form-control-feedback{color:#ffffff}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#ffffff}.has-error .form-control{border-color:#ffffff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-error .input-group-addon{color:#ffffff;border-color:#ffffff;background-color:#e74c3c}.has-error .form-control-feedback{color:#ffffff}.has-feedback label~.form-control-feedback{top:26px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#ffffff}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:11px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:32px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:11px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:24.9999994px;font-size:19px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:7px;font-size:13px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:10px 15px;font-size:15px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#ffffff;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#ffffff;background-color:#464545;border-color:#464545}.btn-default:focus,.btn-default.focus{color:#ffffff;background-color:#2c2c2c;border-color:#060606}.btn-default:hover{color:#ffffff;background-color:#2c2c2c;border-color:#272727}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#ffffff;background-color:#2c2c2c;border-color:#272727}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#ffffff;background-color:#1a1a1a;border-color:#060606}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#464545;border-color:#464545}.btn-default .badge{color:#464545;background-color:#ffffff}.btn-primary{color:#ffffff;background-color:#375a7f;border-color:#375a7f}.btn-primary:focus,.btn-primary.focus{color:#ffffff;background-color:#28415b;border-color:#101b26}.btn-primary:hover{color:#ffffff;background-color:#28415b;border-color:#253c54}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#ffffff;background-color:#28415b;border-color:#253c54}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#ffffff;background-color:#1d2f43;border-color:#101b26}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#375a7f;border-color:#375a7f}.btn-primary .badge{color:#375a7f;background-color:#ffffff}.btn-success{color:#ffffff;background-color:#00bc8c;border-color:#00bc8c}.btn-success:focus,.btn-success.focus{color:#ffffff;background-color:#008966;border-color:#003d2d}.btn-success:hover{color:#ffffff;background-color:#008966;border-color:#007f5e}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#ffffff;background-color:#008966;border-color:#007f5e}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#ffffff;background-color:#00654b;border-color:#003d2d}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#00bc8c;border-color:#00bc8c}.btn-success .badge{color:#00bc8c;background-color:#ffffff}.btn-info{color:#ffffff;background-color:#3498db;border-color:#3498db}.btn-info:focus,.btn-info.focus{color:#ffffff;background-color:#217dbb;border-color:#16527a}.btn-info:hover{color:#ffffff;background-color:#217dbb;border-color:#2077b2}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#ffffff;background-color:#217dbb;border-color:#2077b2}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#ffffff;background-color:#1c699d;border-color:#16527a}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#3498db;border-color:#3498db}.btn-info .badge{color:#3498db;background-color:#ffffff}.btn-warning{color:#ffffff;background-color:#f39c12;border-color:#f39c12}.btn-warning:focus,.btn-warning.focus{color:#ffffff;background-color:#c87f0a;border-color:#7f5006}.btn-warning:hover{color:#ffffff;background-color:#c87f0a;border-color:#be780a}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#ffffff;background-color:#c87f0a;border-color:#be780a}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#ffffff;background-color:#a66908;border-color:#7f5006}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f39c12;border-color:#f39c12}.btn-warning .badge{color:#f39c12;background-color:#ffffff}.btn-danger{color:#ffffff;background-color:#e74c3c;border-color:#e74c3c}.btn-danger:focus,.btn-danger.focus{color:#ffffff;background-color:#d62c1a;border-color:#921e12}.btn-danger:hover{color:#ffffff;background-color:#d62c1a;border-color:#cd2a19}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#ffffff;background-color:#d62c1a;border-color:#cd2a19}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#ffffff;background-color:#b62516;border-color:#921e12}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#e74c3c;border-color:#e74c3c}.btn-danger .badge{color:#e74c3c;background-color:#ffffff}.btn-link{color:#0ce3ac;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#0ce3ac;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999999;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:18px 27px;font-size:19px;line-height:1.3333333;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:6px 9px;font-size:13px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:13px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;-o-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:0.35s;-o-transition-duration:0.35s;transition-duration:0.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.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;font-size:15px;text-align:left;background-color:#303030;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:#464545}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#ebebeb;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#ffffff;background-color:#375a7f}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#ffffff;text-decoration:none;outline:0;background-color:#375a7f}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:13px;line-height:1.42857143;color:#999999;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:66px;padding:18px 27px;font-size:19px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:66px;line-height:66px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:35px;padding:6px 9px;font-size:13px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:35px;line-height:35px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:10px 15px;font-size:15px;font-weight:normal;line-height:1;color:#464545;text-align:center;background-color:#464545;border:1px solid transparent;border-radius:4px}.input-group-addon.input-sm{padding:6px 9px;font-size:13px;border-radius:3px}.input-group-addon.input-lg{padding:18px 27px;font-size:19px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#303030}.nav>li.disabled>a{color:#605e5e}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#605e5e;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#303030;border-color:#0ce3ac}.nav .nav-divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #464545}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#464545 #464545 #464545}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#00bc8c;background-color:#222222;border:1px solid #464545;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ebebeb}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ebebeb;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#222222}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#ffffff;background-color:#375a7f}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ebebeb}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ebebeb;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#222222}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:60px;margin-bottom:21px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:1em;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:19.5px 15px;font-size:19px;line-height:21px;height:60px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:13px;margin-bottom:13px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:9.75px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:21px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:21px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:19.5px;padding-bottom:19.5px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:7.5px;margin-bottom:7.5px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:7.5px;margin-bottom:7.5px}.navbar-btn.btn-sm{margin-top:12.5px;margin-bottom:12.5px}.navbar-btn.btn-xs{margin-top:19px;margin-bottom:19px}.navbar-text{margin-top:19.5px;margin-bottom:19.5px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#375a7f;border-color:transparent}.navbar-default .navbar-brand{color:#ffffff}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#00bc8c;background-color:transparent}.navbar-default .navbar-text{color:#777777}.navbar-default .navbar-nav>li>a{color:#ffffff}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#00bc8c;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#ffffff;background-color:#28415b}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#cccccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#28415b}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#28415b}.navbar-default .navbar-toggle .icon-bar{background-color:#ffffff}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:transparent}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#28415b;color:#ffffff}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#ffffff}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#00bc8c;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#28415b}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#cccccc;background-color:transparent}}.navbar-default .navbar-link{color:#ffffff}.navbar-default .navbar-link:hover{color:#00bc8c}.navbar-default .btn-link{color:#ffffff}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#00bc8c}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#cccccc}.navbar-inverse{background-color:#00bc8c;border-color:transparent}.navbar-inverse .navbar-brand{color:#ffffff}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#375a7f;background-color:transparent}.navbar-inverse .navbar-text{color:#ffffff}.navbar-inverse .navbar-nav>li>a{color:#ffffff}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#375a7f;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#ffffff;background-color:#00a379}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#aaaaaa;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#008966}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#008966}.navbar-inverse .navbar-toggle .icon-bar{background-color:#ffffff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#009871}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#00a379;color:#ffffff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#ffffff}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#375a7f;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#00a379}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#aaaaaa;background-color:transparent}}.navbar-inverse .navbar-link{color:#ffffff}.navbar-inverse .navbar-link:hover{color:#375a7f}.navbar-inverse .btn-link{color:#ffffff}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#375a7f}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#aaaaaa}.breadcrumb{padding:8px 15px;margin-bottom:21px;list-style:none;background-color:#464545;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ffffff}.breadcrumb>.active{color:#999999}.pagination{display:inline-block;padding-left:0;margin:21px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:10px 15px;line-height:1.42857143;text-decoration:none;color:#ffffff;background-color:#00bc8c;border:1px solid transparent;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{z-index:3;color:#ffffff;background-color:#00dba3;border-color:transparent}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#ffffff;background-color:#00dba3;border-color:transparent;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#ffffff;background-color:#007053;border-color:transparent;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:18px 27px;font-size:19px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:6px 9px;font-size:13px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:21px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#00bc8c;border:1px solid transparent;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#00dba3}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#dddddd;background-color:#00bc8c;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#ffffff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#ffffff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#464545}.label-default[href]:hover,.label-default[href]:focus{background-color:#2c2c2c}.label-primary{background-color:#375a7f}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#28415b}.label-success{background-color:#00bc8c}.label-success[href]:hover,.label-success[href]:focus{background-color:#008966}.label-info{background-color:#3498db}.label-info[href]:hover,.label-info[href]:focus{background-color:#217dbb}.label-warning{background-color:#f39c12}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#c87f0a}.label-danger{background-color:#e74c3c}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#d62c1a}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:13px;font-weight:bold;color:#ffffff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#464545;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#375a7f;background-color:#ffffff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#303030}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:23px;font-weight:200}.jumbotron>hr{border-top-color:#161616}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:68px}}.thumbnail{display:block;padding:2px;margin-bottom:21px;line-height:1.42857143;background-color:#222222;border:1px solid #464545;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#0ce3ac}.thumbnail .caption{padding:9px;color:#ffffff}.alert{padding:15px;margin-bottom:21px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#00bc8c;border-color:#00bc8c;color:#ffffff}.alert-success hr{border-top-color:#00a379}.alert-success .alert-link{color:#e6e6e6}.alert-info{background-color:#3498db;border-color:#3498db;color:#ffffff}.alert-info hr{border-top-color:#258cd1}.alert-info .alert-link{color:#e6e6e6}.alert-warning{background-color:#f39c12;border-color:#f39c12;color:#ffffff}.alert-warning hr{border-top-color:#e08e0b}.alert-warning .alert-link{color:#e6e6e6}.alert-danger{background-color:#e74c3c;border-color:#e74c3c;color:#ffffff}.alert-danger hr{border-top-color:#e43725}.alert-danger .alert-link{color:#e6e6e6}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:21px;margin-bottom:21px;background-color:#ebebeb;border-radius:4px;-webkit-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:13px;line-height:21px;color:#ffffff;text-align:center;background-color:#375a7f;-webkit-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-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#00bc8c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#3498db}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#f39c12}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#e74c3c}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#303030;border:1px solid #464545}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#0ce3ac}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#0bcb9a}a.list-group-item:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{text-decoration:none;color:#0ce3ac;background-color:transparent}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#ebebeb;color:#999999;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#999999}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#ffffff;background-color:#375a7f;border-color:#375a7f}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#a8c0da}.list-group-item-success{color:#ffffff;background-color:#00bc8c}a.list-group-item-success,button.list-group-item-success{color:#ffffff}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#ffffff;background-color:#00a379}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-info{color:#ffffff;background-color:#3498db}a.list-group-item-info,button.list-group-item-info{color:#ffffff}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#ffffff;background-color:#258cd1}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-warning{color:#ffffff;background-color:#f39c12}a.list-group-item-warning,button.list-group-item-warning{color:#ffffff}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#ffffff;background-color:#e08e0b}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-danger{color:#ffffff;background-color:#e74c3c}a.list-group-item-danger,button.list-group-item-danger{color:#ffffff}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#ffffff;background-color:#e43725}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:21px;background-color:#303030;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:17px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#464545;border-top:1px solid #464545;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #464545}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:21px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #464545}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #464545}.panel-default{border-color:#464545}.panel-default>.panel-heading{color:#ffffff;background-color:#303030;border-color:#464545}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#464545}.panel-default>.panel-heading .badge{color:#303030;background-color:#ffffff}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#464545}.panel-primary{border-color:#375a7f}.panel-primary>.panel-heading{color:#ffffff;background-color:#375a7f;border-color:#375a7f}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#375a7f}.panel-primary>.panel-heading .badge{color:#375a7f;background-color:#ffffff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#375a7f}.panel-success{border-color:#00bc8c}.panel-success>.panel-heading{color:#ffffff;background-color:#00bc8c;border-color:#00bc8c}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#00bc8c}.panel-success>.panel-heading .badge{color:#00bc8c;background-color:#ffffff}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#00bc8c}.panel-info{border-color:#3498db}.panel-info>.panel-heading{color:#ffffff;background-color:#3498db;border-color:#3498db}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#3498db}.panel-info>.panel-heading .badge{color:#3498db;background-color:#ffffff}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#3498db}.panel-warning{border-color:#f39c12}.panel-warning>.panel-heading{color:#ffffff;background-color:#f39c12;border-color:#f39c12}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#f39c12}.panel-warning>.panel-heading .badge{color:#f39c12;background-color:#ffffff}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#f39c12}.panel-danger{border-color:#e74c3c}.panel-danger>.panel-heading{color:#ffffff;background-color:#e74c3c;border-color:#e74c3c}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#e74c3c}.panel-danger>.panel-heading .badge{color:#e74c3c;background-color:#ffffff}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#e74c3c}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#303030;border:1px solid transparent;border-radius:4px;-webkit-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-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:22.5px;font-weight:bold;line-height:1;color:#ffffff;text-shadow:none;opacity:0.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#ffffff;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#303030;border:1px solid #999999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.7;filter:alpha(opacity=70)}.modal-header{padding:15px;border-bottom:1px solid #464545;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{padding:20px;text-align:right;border-top:1px solid #464545}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:13px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;background-color:#000000;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-width:5px 5px 0;border-top-color:#000000}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:15px;background-color:#303030;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:15px;background-color:#282828;border-bottom:1px solid #1c1c1c;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#666666;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#303030}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#666666;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#303030}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#666666;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#303030}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#666666;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#303030;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:0.5;filter:alpha(opacity=50);font-size:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.5)), to(rgba(0,0,0,0.0001)));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.0001)), to(rgba(0,0,0,0.5)));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #ffffff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#ffffff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.navbar{border-width:0}.navbar-default .badge{background-color:#fff;color:#375a7f}.navbar-inverse .badge{background-color:#fff;color:#00bc8c}.navbar-brand{line-height:1}.navbar-form .form-control{background-color:white}.navbar-form .form-control:focus{border-color:white}.btn{border-width:2px}.btn:active{-webkit-box-shadow:none;box-shadow:none}.btn-group.open .dropdown-toggle{-webkit-box-shadow:none;box-shadow:none}.text-primary,.text-primary:hover{color:#4673a3}.text-success,.text-success:hover{color:#00bc8c}.text-danger,.text-danger:hover{color:#e74c3c}.text-warning,.text-warning:hover{color:#f39c12}.text-info,.text-info:hover{color:#3498db}table a:not(.btn),.table a:not(.btn){text-decoration:underline}table .dropdown-menu a,.table .dropdown-menu a{text-decoration:none}table .success,.table .success,table .warning,.table .warning,table .danger,.table .danger,table .info,.table .info{color:#fff}table .success>th>a,.table .success>th>a,table .warning>th>a,.table .warning>th>a,table .danger>th>a,.table .danger>th>a,table .info>th>a,.table .info>th>a,table .success>td>a,.table .success>td>a,table .warning>td>a,.table .warning>td>a,table .danger>td>a,.table .danger>td>a,table .info>td>a,.table .info>td>a,table .success>a,.table .success>a,table .warning>a,.table .warning>a,table .danger>a,.table .danger>a,table .info>a,.table .info>a{color:#fff}table>thead>tr>th,.table>thead>tr>th,table>tbody>tr>th,.table>tbody>tr>th,table>tfoot>tr>th,.table>tfoot>tr>th,table>thead>tr>td,.table>thead>tr>td,table>tbody>tr>td,.table>tbody>tr>td,table>tfoot>tr>td,.table>tfoot>tr>td{border:none}table-bordered>thead>tr>th,.table-bordered>thead>tr>th,table-bordered>tbody>tr>th,.table-bordered>tbody>tr>th,table-bordered>tfoot>tr>th,.table-bordered>tfoot>tr>th,table-bordered>thead>tr>td,.table-bordered>thead>tr>td,table-bordered>tbody>tr>td,.table-bordered>tbody>tr>td,table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #464545}input,textarea{color:#464545}.form-control,input,textarea{border:2px hidden transparent;-webkit-box-shadow:none;box-shadow:none}.form-control:focus,input:focus,textarea:focus{-webkit-box-shadow:none;box-shadow:none}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label,.has-warning .form-control-feedback{color:#f39c12}.has-warning .form-control,.has-warning .form-control:focus{-webkit-box-shadow:none;box-shadow:none}.has-warning .input-group-addon{border-color:#f39c12}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label,.has-error .form-control-feedback{color:#e74c3c}.has-error .form-control,.has-error .form-control:focus{-webkit-box-shadow:none;box-shadow:none}.has-error .input-group-addon{border-color:#e74c3c}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label,.has-success .form-control-feedback{color:#00bc8c}.has-success .form-control,.has-success .form-control:focus{-webkit-box-shadow:none;box-shadow:none}.has-success .input-group-addon{border-color:#00bc8c}.input-group-addon{color:#ffffff}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{border-color:#464545}.nav-tabs>li>a,.nav-pills>li>a{color:#fff}.pager a,.pager a:hover{color:#fff}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{background-color:#007053}.breadcrumb a{color:#fff}.close{text-decoration:none;text-shadow:none;opacity:0.4}.close:hover,.close:focus{opacity:1}.alert .alert-link{color:#fff;text-decoration:underline}.progress{height:10px;-webkit-box-shadow:none;box-shadow:none}.progress .progress-bar{font-size:10px;line-height:10px}.well{-webkit-box-shadow:none;box-shadow:none}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{border-color:#464545}a.list-group-item-success.active{background-color:#00bc8c}a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{background-color:#00a379}a.list-group-item-warning.active{background-color:#f39c12}a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{background-color:#e08e0b}a.list-group-item-danger.active{background-color:#e74c3c}a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{background-color:#e43725}.popover{color:#ffffff}.panel-default>.panel-heading{background-color:#464545} diff --git a/grails-app/assets/javascripts/streama/controllers/admin-genres-ctrl.js b/grails-app/assets/javascripts/streama/controllers/admin-genres-ctrl.js new file mode 100644 index 000000000..f4d042d26 --- /dev/null +++ b/grails-app/assets/javascripts/streama/controllers/admin-genres-ctrl.js @@ -0,0 +1,42 @@ +//= wrapped + +angular.module('streama').controller('adminGenresCtrl', [ + 'apiService', '$state', '$rootScope', '$filter', function (apiService, $state, $rootScope, $filter) { + var vm = this; + + vm.addGenre = addGenre; + vm.deleteGenre = deleteGenre; + + apiService.genres.list().then(function (response){ + vm.genres = response.data; + }); + + + function addGenre(){ + alertify.set({ buttonReverse: true, labels: {ok: "Create", cancel : "Cancel"}}); + alertify.prompt('Add a new custom genre.', function (confirmed, name) { + if(confirmed){ + apiService.genres.create(name).then(function (response) { + alertify.success('The Genre was created.'); + vm.genres.push(response.data); + }); + } + }) + } + + function deleteGenre(id){ + alertify.set({ buttonReverse: true, labels: {ok: "Yes", cancel : "Cancel"}}); + alertify.confirm("Are you sure, you want to delete this Genre?", function (confirmed) { + if(confirmed){ + apiService.genres.delete(id).then(function () { + _.remove(vm.genres, {id: id}); + }, function (){ + alertify.error('Genre is probably used in a video / tvShow or liked by a user. Delete all usages first, then try again.') + }); + } + }) + } + + }]); + + diff --git a/grails-app/assets/javascripts/streama/controllers/admin-movie-ctrl.js b/grails-app/assets/javascripts/streama/controllers/admin-movie-ctrl.js index 3da591cbe..ccd498efe 100644 --- a/grails-app/assets/javascripts/streama/controllers/admin-movie-ctrl.js +++ b/grails-app/assets/javascripts/streama/controllers/admin-movie-ctrl.js @@ -85,7 +85,7 @@ angular.module('streama').controller('adminMovieCtrl', [ }; $scope.manageFiles = function(movie){ - modalService.fileManagerModal(movie, function (data) { + modalService.fileManagerModal(movie, null, function (data) { movie.hasFiles = !!movie.files.length; }); }; diff --git a/grails-app/assets/javascripts/streama/controllers/admin-show-ctrl.js b/grails-app/assets/javascripts/streama/controllers/admin-show-ctrl.js index 016b76e68..cd65edaad 100644 --- a/grails-app/assets/javascripts/streama/controllers/admin-show-ctrl.js +++ b/grails-app/assets/javascripts/streama/controllers/admin-show-ctrl.js @@ -11,9 +11,7 @@ angular.module('streama').controller('adminShowCtrl', [ $scope.showLoading = true; $scope.hasMovieDBKey = true; - $scope.listEpisodesForSeason = listEpisodesForSeason; - - apiService.theMovieDb.hasKey().then(function (response) { + apiService.theMovieDb.hasKey().then(function (response) { if (!response.data.key) { $scope.hasMovieDBKey = false; } @@ -91,6 +89,7 @@ angular.module('streama').controller('adminShowCtrl', [ $scope.setCurrentSeason = function (index) { $scope.currentSeason = index; + $scope.currentEpisodesForSeason = listEpisodesForSeason(index); if(index){ if($scope.hasMovieDBKey){ apiService.theMovieDb.countNewEpisodesForSeason({apiId: $scope.show.apiId, showId: $stateParams.showId, season: index}) diff --git a/grails-app/assets/javascripts/streama/controllers/admin-transcoding-ctrl.js b/grails-app/assets/javascripts/streama/controllers/admin-transcoding-ctrl.js new file mode 100644 index 000000000..e84c3f213 --- /dev/null +++ b/grails-app/assets/javascripts/streama/controllers/admin-transcoding-ctrl.js @@ -0,0 +1,172 @@ +'use strict'; + +angular.module('streama') + .controller('adminTranscodingCtrl', + ['$scope', 'apiService', '$interval', + function ($scope, apiService, $interval) { + var vm = this; + var statusPollInterval = null; + + vm.loading = true; + vm.status = null; + vm.files = []; + vm.pendingFiles = []; + vm.cacheStats = null; + vm.pagination = { + currentPage: 1 + }; + vm.maxPerPage = 20; + + // Public methods + vm.refreshStatus = refreshStatus; + vm.refreshFiles = refreshFiles; + vm.transcode = transcode; + vm.transcodeAll = transcodeAll; + vm.clearCache = clearCache; + vm.clearAllCache = clearAllCache; + vm.probe = probe; + vm.probeAll = probeAll; + vm.pageChanged = pageChanged; + + // Initialize + init(); + + function init() { + refreshStatus(); + refreshFiles(); + + // Poll for status updates every 5 seconds + statusPollInterval = $interval(function () { + if (vm.status && vm.status.available) { + refreshPending(); + refreshCacheStats(); + } + }, 5000); + + $scope.$on('$destroy', function () { + if (statusPollInterval) { + $interval.cancel(statusPollInterval); + } + }); + } + + function refreshStatus() { + apiService.transcoding.status().then(function (response) { + vm.status = response.data; + vm.loading = false; + + if (vm.status.available) { + refreshCacheStats(); + refreshPending(); + } + }, function (error) { + vm.loading = false; + vm.status = { available: false, error: 'Could not load transcoding status' }; + }); + } + + function refreshCacheStats() { + apiService.transcoding.cacheStats().then(function (response) { + vm.cacheStats = response.data; + }); + } + + function refreshPending() { + apiService.transcoding.pending().then(function (response) { + vm.pendingFiles = response.data; + }); + } + + function refreshFiles() { + var params = { + max: vm.maxPerPage, + offset: (vm.pagination.currentPage - 1) * vm.maxPerPage + }; + + apiService.transcoding.list(params).then(function (response) { + vm.files = response.data.files; + vm.totalFiles = response.data.total; + }); + } + + function transcode(file) { + file.transcoding = true; + apiService.transcoding.transcode(file.id).then(function (response) { + alertify.success('Transcoding started for ' + file.originalFilename); + refreshFiles(); + }, function (error) { + file.transcoding = false; + alertify.error('Failed to start transcoding'); + }); + } + + function transcodeAll() { + alertify.confirm('Start transcoding for all ' + vm.pendingFiles.length + ' pending files?', function (confirmed) { + if (confirmed) { + apiService.transcoding.transcodeAll().then(function (response) { + alertify.success('Batch transcoding started for ' + response.data.count + ' files'); + refreshFiles(); + }, function (error) { + alertify.error('Failed to start batch transcoding'); + }); + } + }); + } + + function clearCache(file) { + alertify.confirm('Clear transcoded cache for ' + file.originalFilename + '?', function (confirmed) { + if (confirmed) { + apiService.transcoding.clearCache(file.id).then(function (response) { + alertify.success('Cache cleared'); + refreshFiles(); + refreshCacheStats(); + }, function (error) { + alertify.error('Failed to clear cache'); + }); + } + }); + } + + function clearAllCache() { + alertify.confirm('Clear ALL transcoded audio cache? This cannot be undone.', function (confirmed) { + if (confirmed) { + apiService.transcoding.clearAllCache().then(function (response) { + alertify.success('Cleared ' + response.data.count + ' cached files'); + refreshFiles(); + refreshCacheStats(); + }, function (error) { + alertify.error('Failed to clear cache'); + }); + } + }); + } + + function probe(file) { + file.probing = true; + apiService.transcoding.probe(file.id).then(function (response) { + alertify.success('File probed: ' + response.data.audioCodec); + file.probing = false; + refreshFiles(); + }, function (error) { + file.probing = false; + alertify.error('Failed to probe file'); + }); + } + + function probeAll() { + alertify.confirm('Probe all unscanned video files for audio codec information?', function (confirmed) { + if (confirmed) { + apiService.transcoding.probeAll().then(function (response) { + alertify.success('Probed ' + response.data.probed + ' files, ' + response.data.failed + ' failed'); + refreshFiles(); + }, function (error) { + alertify.error('Failed to probe files'); + }); + } + }); + } + + function pageChanged() { + refreshFiles(); + } +}]); diff --git a/grails-app/assets/javascripts/streama/controllers/admin-video-ctrl.js b/grails-app/assets/javascripts/streama/controllers/admin-video-ctrl.js index 37b4a5fd6..5c449856e 100644 --- a/grails-app/assets/javascripts/streama/controllers/admin-video-ctrl.js +++ b/grails-app/assets/javascripts/streama/controllers/admin-video-ctrl.js @@ -4,73 +4,83 @@ angular.module('streama').controller('adminVideoCtrl', [ '$scope', 'apiService', '$stateParams', 'modalService', '$state', 'uploadService', function ($scope, apiService, $stateParams, modalService, $state, uploadService) { $scope.loading = true; + $scope.uploadStatus = {}; + + $scope.openVideoModal = openVideoModal; + $scope.manageFiles = manageFiles; + $scope.delete = doDelete; + $scope.addSimilarMovieToStreama = addSimilarMovieToStreama; + $scope.addToCurrentNotification = addToCurrentNotification; + + $scope.upload = initUpload(); + + init(); + + function init(){ + apiService.genericVideo.get($stateParams.videoId).then(function (response) { + var data = response.data; + $scope.video = data; + $scope.loading = false; + $scope.highlightOnDashboard = modalService.newReleaseModal.bind(modalService, $scope.video, 'genericVideo'); + }); + } - apiService.genericVideo.get($stateParams.videoId).then(function (response) { - var data = response.data; - $scope.video = data; - $scope.loading = false; - }); + function initUpload(){ + uploadService.doUpload.bind(uploadService, $scope.uploadStatus, 'video/uploadFile.json?id=' + $stateParams.movieId, function (data) { + $scope.uploadStatus.percentage = null; - $scope.openVideoModal = function () { + if(data.error) return + + $scope.video.files = $scope.video.files || []; + $scope.video.files.push(data); + }, function () {}) + } + + function addToCurrentNotification(){ + apiService.notification.addMovieToCurrentNotification($stateParams.movieId).then(function () { + alertify.success('The movie was added to the current notification queue.'); + }); + } + + function doDelete(){ + alertify.set({ buttonReverse: true, labels: {ok: "Yes", cancel : "Cancel"}}); + alertify.confirm("Are you sure, you want to delete this Video?", function (confirmed) { + if(confirmed){ + apiService.genericVideo.delete($stateParams.videoId).then(function () { + $state.go('admin.videos'); + }); + } + }) + } + + function openVideoModal() { modalService.genericVideoModal($scope.video, function (data) { angular.merge($scope.video, data) }); - }; + } - $scope.delete = function(){ - alertify.set({ buttonReverse: true, labels: {ok: "Yes", cancel : "Cancel"}}); - alertify.confirm("Are you sure, you want to delete this Video?", function (confirmed) { - if(confirmed){ - apiService.genericVideo.delete($stateParams.videoId).then(function () { - $state.go('admin.videos'); - }); - } - }) - }; - - $scope.addToCurrentNotification = function(){ - apiService.notification.addMovieToCurrentNotification($stateParams.movieId).then(function () { - alertify.success('The movie was added to the current notification queue.'); - }); - }; - - $scope.manageFiles = function(video){ - modalService.fileManagerModal(video); - }; + function manageFiles(video){ + modalService.fileManagerModal(video); + } - $scope.addSimilarMovieToStreama = function(movie, redirect){ + function addSimilarMovieToStreama(movie, redirect){ alertify.set({ buttonReverse: true, labels: {ok: "Yes", cancel : "Cancel"}}); - alertify.confirm("Do you want to add \""+ movie.title +"\" to the Streama library?", function (confirmed) { - if(confirmed){ + alertify.confirm("Do you want to add \""+ movie.title +"\" to the Streama library?", function (confirmed) { + if(confirmed){ var apiId = movie.id; delete movie.id; movie.apiId = apiId; apiService.movie.save(movie).then(function (data) { - if(redirect){ - $state.go('admin.movie', {movieId: data.data.id}); - } + if(redirect){ + $state.go('admin.movie', {movieId: data.data.id}); + } }); - } - }) - }; - - $scope.uploadStatus = {}; - - $scope.upload = uploadService.doUpload.bind(uploadService, $scope.uploadStatus, 'video/uploadFile.json?id=' + $stateParams.movieId, function (data) { - $scope.uploadStatus.percentage = null; - - if(data.error) return - - $scope.video.files = $scope.video.files || []; - $scope.video.files.push(data); - }, function () {}); - - - - + } + }) + } }]); diff --git a/grails-app/assets/javascripts/streama/controllers/createFromFileCtrl.modal.js b/grails-app/assets/javascripts/streama/controllers/createFromFileCtrl.modal.js index 3d5857573..44ee4a850 100644 --- a/grails-app/assets/javascripts/streama/controllers/createFromFileCtrl.modal.js +++ b/grails-app/assets/javascripts/streama/controllers/createFromFileCtrl.modal.js @@ -139,14 +139,27 @@ function modalCreateFromFileCtrl($scope, $uibModalInstance, apiService, uploadSe directory.isSelected = !directory.isSelected; if(directory.isSelected){ openLocalDirectory(directory, true, function () { - _.forEach(directory.localFiles, function (file) { - toggleSelection(file); + _.forEach(directory.localFiles, function (content) { + if(content.path.split('\\').pop().split('.').length > 1){ + toggleSelection(content); + }else{ + openLocalDirectory(content, true, function () { + _.forEach(content.localFiles, function (file) { + toggleSelection(file); + }); + }); + }; }); }); }else{ _.forEach(directory.localFiles, function (file) { deselect(file); directory.showFiles = false; + file.showFiles = false; + _.forEach(file.localFiles, function (subfile) { + deselect(subfile); + subfile.showFiles = false; + }); }); } diff --git a/grails-app/assets/javascripts/streama/controllers/dash-ctrl.js b/grails-app/assets/javascripts/streama/controllers/dash-ctrl.js index 8b2c0908f..22558d78d 100644 --- a/grails-app/assets/javascripts/streama/controllers/dash-ctrl.js +++ b/grails-app/assets/javascripts/streama/controllers/dash-ctrl.js @@ -4,12 +4,12 @@ angular.module('streama').controller('dashCtrl', function ($scope, apiService, $state, $rootScope, localStorageService, modalService, $stateParams, mediaListService, currentUser ) { var vm = this; - var LIST_MAX = 30; vm.showDetails = showDetails; vm.handleWatchlistUpdate = handleWatchlistUpdate; vm.loadingRecommendations = true; vm.isDashSectionHidden = isDashSectionHidden; vm.isDashType = isDashType; + vm.getNewReleaseBackdrop = getNewReleaseBackdrop; $scope.$on('changedGenre', onChangedGenre); $scope.$on('video.updateWatchlist', onVideoUpdateWatchlist); @@ -29,8 +29,8 @@ angular.module('streama').controller('dashCtrl', var data = response.data; localStorageService.set('currentProfile', data[0]); initMedia(); - } - , function (data) { + }, + function (data) { alertify.error(data.message); }); } else { @@ -39,19 +39,21 @@ angular.module('streama').controller('dashCtrl', } function initMedia() { - if(isDashType("home") || isDashType("discover-movies")){ - vm.movie = mediaListService.init(apiService.dash.listMovies, {sort: 'title', order: 'ASC'}, currentUser); + if(isDashType('home') || isDashType('discover-movies')){ + vm.movie = mediaListService.init(apiService.dash.listMovies, {sort: 'release_date', order: 'DESC'}, currentUser); } - if(isDashType("home") || isDashType("discover-shows")){ - vm.tvShow = mediaListService.init(apiService.dash.listShows, {sort: 'name', order: 'ASC'}, currentUser); + if(isDashType('home') || isDashType('discover-shows')){ + vm.tvShow = mediaListService.init(apiService.dash.listShows, {sort: 'first_air_date', order: 'DESC'}, currentUser); } - if(isDashType("home") || isDashType("watchlist")){ + if(isDashType('home') || isDashType('continue-watching')){ + vm.continueWatching = mediaListService.init(apiService.dash.listContinueWatching, {sort: 'lastUpdated', order: 'DESC'}, currentUser); + } + if(isDashType('home') || isDashType('watchlist')){ vm.watchlistEntry = mediaListService.init(apiService.watchlistEntry.list, {sort: 'id', order: 'DESC'}, currentUser); } - if(isDashType("home")){ + if(isDashType('home')){ vm.genericVideo = mediaListService.init(apiService.dash.listGenericVideos, {sort: 'title', order: 'ASC'}, currentUser); apiService.dash.listNewReleases().then(onNewReleasesLoaded); - apiService.dash.listContinueWatching().then(onContinueWatchingLoaded); apiService.dash.listRecommendations().then(onRecommendedLoaded); } @@ -71,24 +73,6 @@ angular.module('streama').controller('dashCtrl', vm.loadingRecommendations = false; } - function fetchData(mediaConfig) { - mediaConfig.fetch({max: LIST_MAX, offset: mediaConfig.currentOffset, sort: mediaConfig.currentSort.sort, order: mediaConfig.currentSort.order}).then(function (response) { - var data = response.data; - mediaConfig.total = data.total; - if(mediaConfig.currentOffset > 0){ - mediaConfig.list = _.unionBy(mediaConfig.list, data.list, 'id'); - }else{ - mediaConfig.list = data.list; - } - mediaConfig.isLoading = false; - }); - } - - function onContinueWatchingLoaded(response) { - var data = response.data; - vm.continueWatching = data; - } - function onNewReleasesLoaded(response) { var data = response.data; vm.newReleases = data; @@ -152,10 +136,10 @@ angular.module('streama').controller('dashCtrl', function handleWatchlistUpdate(action, item){ switch (action) { - case "added": + case 'added': addToWatchlist(item); break; - case "removed": + case 'removed': removeFromWatchlist(item); break; } @@ -164,17 +148,17 @@ angular.module('streama').controller('dashCtrl', function addToWatchlist(item) { apiService.watchlistEntry.create(item).then(function (response) { vm.watchlistEntry.list = vm.watchlistEntry.list ? vm.watchlistEntry.list : []; - updateWatchlist("added", _.get(vm.watchlistEntry, 'list'), item, response.data); + updateWatchlist('added', _.get(vm.watchlistEntry, 'list'), item, response.data); }); } function removeFromWatchlist(item) { vm.watchlistEntry.list = vm.watchlistEntry.list ? vm.watchlistEntry.list : []; - alertify.set({buttonReverse: true, labels: {ok: "Yes", cancel: "Cancel"}}); - alertify.confirm("Are you sure you want to remove this video from your watchlist?", function (confirmed) { + alertify.set({buttonReverse: true, labels: {ok: 'Yes', cancel: 'Cancel'}}); + alertify.confirm('Are you sure you want to remove this video from your watchlist?', function (confirmed) { if (confirmed) { apiService.watchlistEntry.delete(item).then(function (response) { - updateWatchlist("removed", _.get(vm.watchlistEntry, 'list'), item); + updateWatchlist('removed', _.get(vm.watchlistEntry, 'list'), item); }); } }); @@ -189,27 +173,27 @@ angular.module('streama').controller('dashCtrl', removeMediaFromList(list, media); alertify.success('The '+type+' was removed from your watchlist.'); } - list.sort(function(a,b) { return (a.id < b.id) ? 1 : ((a.id > b.id) ? -1 : 0)}); + list.sort(function(a,b) { return (a.id < b.id) ? 1 : ((a.id > b.id) ? -1 : 0);}); } function removeMediaFromList(list, media){ _.remove(list, function (watchlistEntry) { - return (watchlistEntry.video ? watchlistEntry.video.id : watchlistEntry.tvShow.id) === media.id + return (watchlistEntry.video ? watchlistEntry.video.id : watchlistEntry.tvShow.id) === media.id; }); } function handleVideoListsUpdate(media){ var type = media.mediaType; switch (type) { - case "tvShow": + case 'tvShow': watchlistStatusHandler(vm.tvShow.list, media); - type = "show"; + type = 'show'; break; - case "movie": + case 'movie': watchlistStatusHandler(vm.movie.list, media); type = 'movie'; break; - case "genericVideo": + case 'genericVideo': watchlistStatusHandler(vm.genericVideo.list, media); type = 'video'; break; @@ -218,34 +202,16 @@ angular.module('streama').controller('dashCtrl', } watchlistStatusHandler(vm.newReleases, media); watchlistStatusHandler(vm.continueWatching, media); - return type + return type; } function watchlistStatusHandler(mediaList, item){ - var index = _.findIndex(mediaList, function(element) { return item.id === element.id}); + var index = _.findIndex(mediaList, function(element) { return item.id === element.id;}); if(index > 0){ - mediaList[index].inWatchlist = !mediaList[index].inWatchlist + mediaList[index].inWatchlist = !mediaList[index].inWatchlist; } } - function applyFilter(item, filterObj) { - var showItemArray = []; - - _.forEach(filterObj, function (filterVal, key) { - if (_.isArray(filterVal) && filterVal.length) { - var intersection = _.intersectionBy(item[key], filterVal, 'id'); - var isVisible = (intersection.length ? true : false); - showItemArray.push(isVisible); - } - if (_.isString(filterVal) && filterVal.length >= 1) { - var isVisible = (_.includes(item[key].toLowerCase(), filterVal.toLowerCase()) ? true : false); - showItemArray.push(isVisible); - } - }); - - return (showItemArray.indexOf(false) < 0); - } - function isDashSectionHidden(sectionName) { var hiddenDashSectionSetting = _.find($scope.settings, {name: 'hidden_dash_sections'}); if(_.get(hiddenDashSectionSetting, 'parsedValue')){ @@ -259,4 +225,12 @@ angular.module('streama').controller('dashCtrl', updateWatchlist(data.action, _.get(vm.watchlistEntry, 'list'), data.media, _.get(data.response, 'data')); } + function getNewReleaseBackdrop(media){ + if(media.backdrop_path){ + return 'https://image.tmdb.org/t/p/original' + media.backdrop_path; + }else if(media.backdrop_image_src){ + return media.backdrop_image_src; + } + } + }); diff --git a/grails-app/assets/javascripts/streama/controllers/modal-file-ctrl.js b/grails-app/assets/javascripts/streama/controllers/modal-file-ctrl.js index 987e9c010..19b223cec 100644 --- a/grails-app/assets/javascripts/streama/controllers/modal-file-ctrl.js +++ b/grails-app/assets/javascripts/streama/controllers/modal-file-ctrl.js @@ -1,58 +1,67 @@ 'use strict'; angular.module('streama').controller('modalFileCtrl', [ - '$scope', '$uibModalInstance', 'apiService', 'uploadService', 'video', 'localStorageService', '$rootScope', - function ($scope, $uibModalInstance, apiService, uploadService, video, localStorageService, $rootScope) { + '$scope', '$uibModalInstance', 'apiService', 'modalService', 'uploadService', 'video', 'episodes', 'localStorageService', '$rootScope', + function ($scope, $uibModalInstance, apiService, modalService, uploadService, video, episodes, localStorageService, $rootScope) { $scope.loading = false; $scope.localFilesEnabled = false; $scope.localFiles = []; - $scope.activeTab = localStorageService.get('activeFileModalTab')|| 'upload'; + $scope.activeTab = localStorageService.get('activeFileModalTab') || 'upload'; $scope.closeOnSelect = localStorageService.get('fileModal.closeOnSelect'); - if($scope.closeOnSelect == null){$scope.closeOnSelect = true;} + if ($scope.closeOnSelect === null) { + $scope.closeOnSelect = true; + } - var localFileLastPath = localStorageService.get('localFileLastPath')|| ''; - $scope.localDir = localFileLastPath.split('/') || []; + var localFileLastPath = localStorageService.get('localFileLastPath') || ''; + $scope.localDir = localFileLastPath.split('/') || []; $scope.video = video; $scope.uploadStatus = {}; - $scope.upload = uploadService.doUpload.bind(uploadService, $scope.uploadStatus, 'video/uploadFile.json?id=' + video.id, onUploadSuccess, function () {}); + $scope.upload = uploadService.doUpload.bind(uploadService, $scope.uploadStatus, 'video/uploadFile.json?id=' + video.id, onUploadSuccess, function () { + }); + $scope.openNextEpisode = localStorageService.get('fileModal.closeOnSelect'); $scope.loadLocalFiles = loadLocalFiles; - $scope.backLocalDirectory = backLocalDirectory; - $scope.openLocalDirectory = openLocalDirectory; - $scope.toggleCloseOnSelect = toggleCloseOnSelect; + $scope.backLocalDirectory = backLocalDirectory; + $scope.openLocalDirectory = openLocalDirectory; + $scope.toggleCloseOnSelect = toggleCloseOnSelect; $scope.addLocalFile = addLocalFile; $scope.cancel = cancel; $scope.removeFile = removeFile; + $scope.removeSubtitle = removeSubtitle; $scope.saveChanges = saveChanges; + $scope.generateDownloadUrl = generateDownloadUrl; + $scope.setAsDefault = setAsDefault; $scope.getFilesForExtensions = getFilesForExtensions; $scope.addExternalUrl = addExternalUrl; $scope.toggleEdit = toggleEdit; $scope.isEditing = isEditing; + $scope.toggleOpenNextEpisode = toggleOpenNextEpisode; + $scope.closeAndOpenNext = closeAndOpenNext; - $scope.loadLocalFiles(localFileLastPath); + $scope.loadLocalFiles(localFileLastPath); - $scope.$watch('activeTab', onTabChange); + $scope.$watch('activeTab', onTabChange); function onTabChange(newVal, oldVal) { localStorageService.set('activeFileModalTab', newVal); } - function loadLocalFiles(path) { - if(!_.get($rootScope.getSetting('Local Video Files'), 'value')){ + function loadLocalFiles(path) { + if (!_.get($rootScope.getSetting('Local Video Files'), 'value')) { return; } - apiService.file.localFiles(path).then(function(response) { - localStorageService.set('localFileLastPath', path); - $scope.localFilesEnabled = true; - $scope.localFiles = response.data; - }, function(data) { - if (data.code == 'LocalFilesNotEnabled') { - $scope.localFilesEnabled = false; - return; - } - alertify.error(data.message); - }); - } + apiService.file.localFiles(path).then(function (response) { + localStorageService.set('localFileLastPath', path); + $scope.localFilesEnabled = true; + $scope.localFiles = response.data; + }, function (data) { + if (data.code === 'LocalFilesNotEnabled') { + $scope.localFilesEnabled = false; + return; + } + alertify.error(data.message); + }); + } function backLocalDirectory() { $scope.localFiles = []; @@ -66,15 +75,14 @@ angular.module('streama').controller('modalFileCtrl', [ $scope.loadLocalFiles($scope.localDir.join('/')); } - function addExternalUrl(externalUrl) { apiService.video.addExternalUrl({id: $scope.video.id, externalUrl: externalUrl}).then(function (response) { - alertify.success("External URL Added."); + alertify.success('External URL Added.'); $scope.video.externalLink = null; - if(_.find($scope.video.videoFiles, {id: response.data.id})){ + if (_.find($scope.video.videoFiles, {id: response.data.id})) { $scope.video.videoFiles[_.indexOf($scope.video.videoFiles, {id: data.id})] = response.data; - }else{ + } else { $scope.video.videoFiles = $scope.video.videoFiles || []; $scope.video.videoFiles.push(data); $scope.video.hasFiles = true; @@ -85,36 +93,58 @@ angular.module('streama').controller('modalFileCtrl', [ function addLocalFile(localFile) { apiService.video.addLocalFile({id: $scope.video.id, localFile: localFile}).then(function (response) { var data = response.data; - alertify.success("Local File Added."); + alertify.success('Local File Added.'); $scope.video.localFile = null; - if(_.find($scope.video.videoFiles, {id: data.id})){ + if (_.find($scope.video.videoFiles, {id: data.id})) { $scope.video.videoFiles[_.indexOf($scope.video.videoFiles, {id: data.id})] = data; - }else{ + } else { $scope.video.videoFiles = $scope.video.videoFiles || []; $scope.video.videoFiles.push(data); $scope.video.hasFiles = true; } - if($scope.closeOnSelect){ + if ($scope.closeOnSelect) { $uibModalInstance.dismiss('cancel'); } - }, function(data) { + }, function (data) { alertify.error(data.message); }); + loadNextEpisodeModal(); + } + + function loadNextEpisodeModal() { + var currentSeason = _.filter(episodes, {'season_number': $scope.video.season_number}); + var lastEpisodeId = currentSeason[currentSeason.length - 1].id; + var nextEpisodeId = $scope.video.id + 1; + var nextEpisode = _.find(episodes, {id: nextEpisodeId}); + if ($scope.openNextEpisode && $scope.video.id < lastEpisodeId) { + modalService.fileManagerModal(nextEpisode, episodes); + } } function removeFile(file) { - alertify.set({ buttonReverse: true, labels: {ok: "Yes", cancel : "Cancel"}}); - alertify.confirm('Are you sure you want to remove the file "'+file.originalFilename+'"?', function (confirmed) { - if(confirmed){ + alertify.set({buttonReverse: true, labels: {ok: 'Yes', cancel: 'Cancel'}}); + alertify.confirm('Are you sure you want to remove the file "' + file.originalFilename + '"?', function (confirmed) { + if (confirmed) { + apiService.video.removeFile($scope.video.id, file.id).then(function () { + _.remove($scope.video.videoFiles, {id: file.id}); + alertify.success('Video deleted.'); + }); + } + }); + } + + function removeSubtitle(file) { + alertify.set({buttonReverse: true, labels: {ok: 'Yes', cancel: 'Cancel'}}); + alertify.confirm('Are you sure you want to remove the file "' + file.originalFilename + '"?', function (confirmed) { + if (confirmed) { apiService.video.removeFile($scope.video.id, file.id).then(function () { - if(file.extension == '.srt' || file.extension == '.vtt'){ - _.remove($scope.video.subtitles, {id: file.id}); - alertify.success('Subtitles deleted.'); - }else{ - _.remove($scope.video.videoFiles, {id: file.id}); - alertify.success('Video deleted.'); - } + _.remove($scope.video.subtitles, {id: file.id}); + alertify.success('Subtitles deleted.'); + }).then(function (){ + apiService.subtitle.refreshSubtitles($scope.video.id).then(function (data) { + $scope.video.subtitles = data.data; + }); }); } }); @@ -123,6 +153,12 @@ angular.module('streama').controller('modalFileCtrl', [ function cancel() { $uibModalInstance.dismiss('cancel'); } + + function closeAndOpenNext() { + $uibModalInstance.dismiss('cancel'); + loadNextEpisodeModal(); + } + function saveChanges(file) { apiService.file.save(file).then(function (data) { alertify.success('File successfully saved.'); @@ -130,16 +166,27 @@ angular.module('streama').controller('modalFileCtrl', [ }); } + function setAsDefault(file) { + apiService.subtitle.setDefault(file.id, $scope.video.id).then(function (data) { + video.subtitles.forEach(function (s){ + s.isDefault = false; + }); + file.isDefault = true; + alertify.success('Successfully set by default'); + }); + } + function onUploadSuccess(data) { $scope.uploadStatus.percentage = null; - if(data.error) return; - - if(data.extension == '.srt' || data.extension == '.vtt'){ + if (data.error) { + return; + } + if (data.extension === '.srt' || data.extension === '.vtt') { $scope.video.subtitles = $scope.video.subtitles || []; $scope.video.subtitles.push(data); $scope.video.hasFiles = true; alertify.success('Subtitles uploaded successfully.'); - }else{ + } else { $scope.video.videoFiles = $scope.video.videoFiles || []; $scope.video.videoFiles.push(data); $scope.video.hasFiles = true; @@ -148,16 +195,28 @@ angular.module('streama').controller('modalFileCtrl', [ } + $scope.manageOpenSubtitle = function (video) { + modalService.openSubtitlesManagerModal(video); + }; + + function generateDownloadUrl(id) { + var loc = window.location.origin; + return loc + '/file/serve/' + id; + } function toggleCloseOnSelect() { $scope.closeOnSelect = !$scope.closeOnSelect; localStorageService.set('fileModal.closeOnSelect', $scope.closeOnSelect); } - function getFilesForExtensions(extensions){ + function toggleOpenNextEpisode() { + $scope.openNextEpisode = $scope.openNextEpisode !== true; + } + + function getFilesForExtensions(extensions) { return _.filter($scope.video.videoFiles, function (file) { return (extensions.indexOf(file.extension.toLowerCase()) > -1); - }) + }); } function toggleEdit(file) { @@ -168,4 +227,85 @@ angular.module('streama').controller('modalFileCtrl', [ return file._isEditing; } + // Language code to full name mapping (includes ISO codes AND full names) + var languageMap = { + 'en': 'English', 'eng': 'English', 'english': 'English', + 'sv': 'Swedish', 'swe': 'Swedish', 'sve': 'Swedish', 'swedish': 'Swedish', + 'de': 'German', 'ger': 'German', 'deu': 'German', 'german': 'German', + 'fr': 'French', 'fre': 'French', 'fra': 'French', 'french': 'French', + 'es': 'Spanish', 'spa': 'Spanish', 'spanish': 'Spanish', + 'it': 'Italian', 'ita': 'Italian', 'italian': 'Italian', + 'pt': 'Portuguese', 'por': 'Portuguese', 'portuguese': 'Portuguese', + 'nl': 'Dutch', 'dut': 'Dutch', 'nld': 'Dutch', 'dutch': 'Dutch', + 'da': 'Danish', 'dan': 'Danish', 'danish': 'Danish', + 'no': 'Norwegian', 'nor': 'Norwegian', 'nob': 'Norwegian', 'norwegian': 'Norwegian', + 'fi': 'Finnish', 'fin': 'Finnish', 'finnish': 'Finnish', + 'pl': 'Polish', 'pol': 'Polish', 'polish': 'Polish', + 'ru': 'Russian', 'rus': 'Russian', 'russian': 'Russian', + 'ja': 'Japanese', 'jpn': 'Japanese', 'japanese': 'Japanese', + 'ko': 'Korean', 'kor': 'Korean', 'korean': 'Korean', + 'zh': 'Chinese', 'chi': 'Chinese', 'zho': 'Chinese', 'chinese': 'Chinese', + 'ar': 'Arabic', 'ara': 'Arabic', 'arabic': 'Arabic', + 'he': 'Hebrew', 'heb': 'Hebrew', 'hebrew': 'Hebrew', + 'tr': 'Turkish', 'tur': 'Turkish', 'turkish': 'Turkish', + 'el': 'Greek', 'gre': 'Greek', 'ell': 'Greek', 'greek': 'Greek', + 'cs': 'Czech', 'cze': 'Czech', 'ces': 'Czech', 'czech': 'Czech', + 'hu': 'Hungarian', 'hun': 'Hungarian', 'hungarian': 'Hungarian', + 'ro': 'Romanian', 'rum': 'Romanian', 'ron': 'Romanian', 'romanian': 'Romanian', + 'th': 'Thai', 'tha': 'Thai', 'thai': 'Thai', + 'vi': 'Vietnamese', 'vie': 'Vietnamese', 'vietnamese': 'Vietnamese', + 'id': 'Indonesian', 'ind': 'Indonesian', 'indonesian': 'Indonesian', + 'hr': 'Croatian', 'hrv': 'Croatian', 'croatian': 'Croatian', + 'bg': 'Bulgarian', 'bul': 'Bulgarian', 'bulgarian': 'Bulgarian', + 'uk': 'Ukrainian', 'ukr': 'Ukrainian', 'ukrainian': 'Ukrainian', + 'sr': 'Serbian', 'srp': 'Serbian', 'serbian': 'Serbian', + 'sk': 'Slovak', 'slo': 'Slovak', 'slk': 'Slovak', 'slovak': 'Slovak', + 'sl': 'Slovenian', 'slv': 'Slovenian', 'slovenian': 'Slovenian', + 'forced': 'Forced' // for forced subtitles + }; + + $scope.autodetectLabel = function(file) { + var filename = file.originalFilename || ''; + // Remove extension + var nameWithoutExt = filename.replace(/\.(srt|vtt|sub|ass|ssa)$/i, ''); + // Split by common delimiters + var parts = nameWithoutExt.split(/[.\-_\s]/); + + // Search for language code in the parts (check last few parts first) + for (var i = parts.length - 1; i >= 0 && i >= parts.length - 4; i--) { + var part = parts[i].toLowerCase(); + if (languageMap[part]) { + file.subtitleSrcLang = part; + file.subtitleLabel = languageMap[part]; + file._isEditing = true; + alertify.success('Detected: ' + languageMap[part]); + return; + } + } + alertify.warning('Could not detect language from filename'); + }; + + $scope.autodetectAllLabels = function() { + var detected = 0; + ($scope.video.subtitles || []).forEach(function(file) { + var filename = file.originalFilename || ''; + var nameWithoutExt = filename.replace(/\.(srt|vtt|sub|ass|ssa)$/i, ''); + var parts = nameWithoutExt.split(/[.\-_\s]/); + + for (var i = parts.length - 1; i >= 0 && i >= parts.length - 4; i--) { + var part = parts[i].toLowerCase(); + if (languageMap[part]) { + file.subtitleSrcLang = part; + file.subtitleLabel = languageMap[part]; + detected++; + break; + } + } + }); + if (detected > 0) { + alertify.success('Detected language for ' + detected + ' subtitle(s)'); + } else { + alertify.warning('Could not detect any languages'); + } + }; }]); diff --git a/grails-app/assets/javascripts/streama/controllers/modal-media-detail-ctrl.js b/grails-app/assets/javascripts/streama/controllers/modal-media-detail-ctrl.js index 84a528ec5..d1acf7bc7 100644 --- a/grails-app/assets/javascripts/streama/controllers/modal-media-detail-ctrl.js +++ b/grails-app/assets/javascripts/streama/controllers/modal-media-detail-ctrl.js @@ -38,6 +38,10 @@ angular.module('streama').controller('modalMediaDetailCtrl', [ var firstEpisode = response.data; $scope.firstEpisode = firstEpisode; }); + apiService.dash.randomEpisodeForShow($scope.media.id).then(function (response) { + var randomEpisode = response.data; + $scope.randomEpisode = randomEpisode; + }); } }); } @@ -63,7 +67,7 @@ angular.module('streama').controller('modalMediaDetailCtrl', [ if(media.isGenericVideo){ $state.go('admin.video', {videoId: media.id}); } - if(media.title){ + else if(media.title){ $state.go('admin.movie', {movieId: media.id}); } else if(media.name){ diff --git a/grails-app/assets/javascripts/streama/controllers/modal-new-release-ctrl.js b/grails-app/assets/javascripts/streama/controllers/modal-new-release-ctrl.js index 8bbe5a3ec..efd99d2cd 100644 --- a/grails-app/assets/javascripts/streama/controllers/modal-new-release-ctrl.js +++ b/grails-app/assets/javascripts/streama/controllers/modal-new-release-ctrl.js @@ -23,8 +23,7 @@ angular.module('streama').controller('modalNewReleaseCtrl', [ .then(function () { alertify.success('Highlight complete.'); $uibModalInstance.close(); - }) - .error(function (err, status) { + }, function (err, status) { console.log('%c error', 'color: deeppink; font-weight: bold; text-shadow: 0 0 5px deeppink;'); alertify.error(err.message); }); diff --git a/grails-app/assets/javascripts/streama/controllers/modal-opensubtitles-ctrl.js b/grails-app/assets/javascripts/streama/controllers/modal-opensubtitles-ctrl.js new file mode 100644 index 000000000..09a8d653f --- /dev/null +++ b/grails-app/assets/javascripts/streama/controllers/modal-opensubtitles-ctrl.js @@ -0,0 +1,62 @@ +'use strict'; + + +angular.module('streama').controller('modalOpensubtitleCtrl', [ + '$scope', '$uibModalInstance', 'apiService', 'video', 'localStorageService', 'languageData', '$rootScope', + function ($scope, $uibModalInstance, apiService, video, localStorageService, languageData, $rootScope) { + + $scope.videoName = video.name || video.title + $scope.loading = false; + $scope.localFilesEnabled = false; + $scope.localFiles = []; + $scope.opensubtitles; + $scope.isSearch = false; + $scope.colMd = 12; + $scope.numberOfResults = 0; + + var englishLanguage = languageData[121].IdSubLanguage; + + $scope.opensubtitleLanguages = { + availableOptions: languageData, + defaultValue: englishLanguage + }; + + $scope.activeTab = localStorageService.get('activeFileModalTab') || 'upload'; + $scope.searchByHash = false + + + var localFileLastPath = localStorageService.get('localFileLastPath') || ''; + $scope.localDir = localFileLastPath.split('/') || []; + $scope.video = video; + $scope.uploadStatus = {}; + + $scope.getSubtitles = getSubtitles; + $scope.uploadSubtitles = uploadSubtitles; + $scope.cancel = cancel; + + function getSubtitles() { + apiService.subtitle.getOpensubtitles(video, $scope.videoName, $scope.opensubtitleLanguages.defaultValue, $scope.searchByHash).then(function (data) { + $scope.opensubtitles = data.data; + $scope.isSearch = true; + $scope.colMd = 6; + $scope.numberOfResults = data.data.length; + }, function (data) { + alertify.error(data.data.message); + }); + } + + function uploadSubtitles(opensubtitle) { + apiService.subtitle.uploadOpensubtitles(opensubtitle, video.id).then(function (data) { + alertify.success('Successfully loaded'); + }, function () { + alertify.log('Failed to load file. Try again.'); + }); + } + + function cancel() { + apiService.subtitle.refreshSubtitles($scope.video.id).then(function (data) { + $scope.video.subtitles = data.data; + }); + $uibModalInstance.dismiss('cancel'); + } + }]); diff --git a/grails-app/assets/javascripts/streama/controllers/settings-settings-ctrl.js b/grails-app/assets/javascripts/streama/controllers/settings-settings-ctrl.js index 1cca2941a..38fc641d0 100644 --- a/grails-app/assets/javascripts/streama/controllers/settings-settings-ctrl.js +++ b/grails-app/assets/javascripts/streama/controllers/settings-settings-ctrl.js @@ -24,29 +24,34 @@ angular.module('streama') window.location.reload(); alertify.success('Settings saved.'); }) - }; - + }; - $scope.validateSettings = function (settings) { - if($scope.loading === true){ - return - } - $scope.changeValue(settings); - $scope.loading = true; + $scope.validateSettings = function (settings) { + if ($scope.loading === true) { + return + } + $scope.changeValue(settings); + $scope.loading = true; - apiService.settings.validateSettings(settings).then(function (response) { + apiService.settings.validateSettings(settings).then(function (response) { var data = response.data; - alertify.success(data.message || 'validation successful'); + + //Allows user to save other settings, even if credentials are invalid or there were problems with opensubtitles api + if (data.message.includes("Invalid credentials") || data.message.includes("problems")) { + alertify.log(data.message) + } else { + alertify.success(data.message || 'validation successful'); + } settings.valid = true; $scope.loading = false; }, function (response) { - var data = response.data; + var data = response.data; alertify.error(data.message); settings.invalid = true; $scope.loading = false; }); - }; + }; $scope.changeValue = function (settings) { if(settings.validationRequired === false){ diff --git a/grails-app/assets/javascripts/streama/controllers/user-settings-ctrl.js b/grails-app/assets/javascripts/streama/controllers/user-settings-ctrl.js index 20473793c..9bcb5a1e1 100644 --- a/grails-app/assets/javascripts/streama/controllers/user-settings-ctrl.js +++ b/grails-app/assets/javascripts/streama/controllers/user-settings-ctrl.js @@ -6,6 +6,7 @@ angular.module('streama').controller('userSettingsCtrl', function ($scope, apiSe $scope.passwordData = {}; $scope.passwordsInvalid = true; $scope.languages = true; + $scope.lastLogin = null; apiService.theMovieDb.availableGenres().then(function (response) { @@ -14,6 +15,10 @@ angular.module('streama').controller('userSettingsCtrl', function ($scope, apiSe $scope.loading = false; }); + apiService.userActivity.lastLogin().then(function (response) { + $scope.lastLogin = response.data; + }); + $scope.toggleSelectGenre = function (genre) { $scope.user.favoriteGenres = _.xorBy($scope.user.favoriteGenres, [genre], 'apiId'); $scope.profileForm.$setDirty(); diff --git a/grails-app/assets/javascripts/streama/directives/admin-episode-directive.js b/grails-app/assets/javascripts/streama/directives/admin-episode-directive.js index d3bbe8ea7..dbbe9fcb8 100644 --- a/grails-app/assets/javascripts/streama/directives/admin-episode-directive.js +++ b/grails-app/assets/javascripts/streama/directives/admin-episode-directive.js @@ -1,12 +1,14 @@ 'use strict'; angular.module('streama').directive('adminEpisode', [ - 'uploadService', 'modalService', 'apiService', '$stateParams', function (uploadService, modalService, apiService, $stateParams) { + 'uploadService', 'modalService', 'apiService', '$stateParams', + function (uploadService, modalService, apiService, $stateParams) { return { restrict: 'AE', templateUrl: '/streama/directive--admin-episode.htm', scope: { - episode: '=' + episode: '=', + episodes: '=' }, link: function ($scope, $elem, $attrs) { $scope.uploadStatus = {}; @@ -40,7 +42,7 @@ angular.module('streama').directive('adminEpisode', [ $scope.manageFiles = function(episode){ - modalService.fileManagerModal(episode); + modalService.fileManagerModal(episode, $scope.episodes); }; diff --git a/grails-app/assets/javascripts/streama/directives/streama-dash-media-item.js b/grails-app/assets/javascripts/streama/directives/streama-dash-media-item.js index e9d7bd322..cdfe16f95 100644 --- a/grails-app/assets/javascripts/streama/directives/streama-dash-media-item.js +++ b/grails-app/assets/javascripts/streama/directives/streama-dash-media-item.js @@ -16,6 +16,7 @@ angular.module('streama').directive('streamaDashMediaItem', function () { function controller(apiService, modalService, $rootScope, $state, $scope) { var vm = this; vm.fetchFirstEpisodeAndPlay = fetchFirstEpisodeAndPlay; + vm.fetchRandomEpisodeAndPlay = fetchRandomEpisodeAndPlay; vm.showDetails = showDetails; vm.handleWatchlistUpdate = handleWatchlistUpdate; vm.markCompleted = markCompleted; @@ -28,6 +29,13 @@ function controller(apiService, modalService, $rootScope, $state, $scope) { }); } + + function fetchRandomEpisodeAndPlay(tvShow) { + apiService.dash.randomEpisodeForShow(tvShow.id).then(function (response) { + $state.go('player', {videoId: response.data.id}); + }); + } + function showDetails(media) { if(media.mediaType === 'episode'){ modalService.mediaDetailModal({mediaId: media.tvShowId, mediaType: 'tvShow', isApiMovie: false}); diff --git a/grails-app/assets/javascripts/streama/directives/streama-header-directive.js b/grails-app/assets/javascripts/streama/directives/streama-header-directive.js deleted file mode 100644 index 8a296925a..000000000 --- a/grails-app/assets/javascripts/streama/directives/streama-header-directive.js +++ /dev/null @@ -1,21 +0,0 @@ -//= wrapped - - -angular.module('streama') - .directive('streamaHeaderDirective', streamaHeaderDirective); - -function streamaHeaderDirective($window) { - return { - restrict: 'A', - scope: {}, - link: function ($scope, $elem, $attrs) { - angular.element($window).bind('scroll', function () { - if($window.pageYOffset > 0){ - $elem.css({'background': 'rgb(20, 20, 20)'}); - }else{ - $elem.css({'background': 'linear-gradient(to bottom, rgba(0,0,0,1), rgba(0,0,0,0))'}); - } - }); - } - } -}; diff --git a/grails-app/assets/javascripts/streama/directives/streama-video-player-directive.js b/grails-app/assets/javascripts/streama/directives/streama-video-player-directive.js index 45c97840c..e7d84684a 100644 --- a/grails-app/assets/javascripts/streama/directives/streama-video-player-directive.js +++ b/grails-app/assets/javascripts/streama/directives/streama-video-player-directive.js @@ -1,8 +1,8 @@ 'use strict'; angular.module('streama').directive('streamaVideoPlayer', [ - 'uploadService', 'apiService', 'localStorageService', '$timeout', 'playerService', '$http', '$sce', 'modalService', - function (uploadService, apiService, localStorageService, $timeout, playerService, $http, $sce, modalService) { + 'uploadService', 'apiService', 'localStorageService', '$timeout', 'playerService', '$http', '$sce', 'modalService', '$interval', + function (uploadService, apiService, localStorageService, $timeout, playerService, $http, $sce, modalService, $interval) { return { restrict: 'AE', @@ -25,6 +25,7 @@ angular.module('streama').directive('streamaVideoPlayer', [ var skipIntro = true; //Userflag intro should be skipped var minimizeOnOutro = true; //Userflag skip to next episode on outro var videoSrc = $scope.options.videoSrc.toString(); + var transcodingPollInterval = null; $scope.showControls = showControls; $scope.toggleSelectEpisodes = toggleSelectEpisodes; @@ -47,19 +48,63 @@ angular.module('streama').directive('streamaVideoPlayer', [ $scope.isNextVideoShowing = false; $scope.loading = true; $scope.initialPlay = false; + $scope.isTranscoding = false; + $scope.transcodingProgress = 0; if (!$scope.options.isExternalLink) { + checkVideoAndInit(); + } else { + initDirective(); + } + + function checkVideoAndInit() { $http.head(videoSrc) - .then(function () { + .then(function (response) { initDirective(); - }, - function (data, status) { - if (status == 406) { + }, function (response) { + if (response.status === 406) { $scope.options.onError('FILE_IN_FS_NOT_FOUND'); + } else if (response.status === 202) { + // Transcoding in progress - show transcoding UI and poll for completion + handleTranscodingResponse(response.data); + } else { + initDirective(); } }); - } else { - initDirective(); + } + + function handleTranscodingResponse(data) { + $scope.isTranscoding = true; + $scope.transcodingProgress = (data && data.progress) ? Math.round(data.progress * 100) : 0; + $scope.loading = false; + + // Start polling for transcoding status + if (!transcodingPollInterval) { + var fileId = $scope.options.selectedVideoFile.id; + transcodingPollInterval = $interval(function () { + apiService.file.transcodingStatus(fileId).then(function (response) { + var status = response.data; + $scope.transcodingProgress = status.progress ? Math.round(status.progress * 100) : 0; + + if (status.status === 'ready' || status.status === 'completed' || status.hasTranscodedAudio) { + // Transcoding complete - stop polling and init player + $interval.cancel(transcodingPollInterval); + transcodingPollInterval = null; + $scope.isTranscoding = false; + $scope.loading = true; + initDirective(); + } else if (status.status === 'failed') { + $interval.cancel(transcodingPollInterval); + transcodingPollInterval = null; + $scope.isTranscoding = false; + $scope.options.onError('TRANSCODING_FAILED'); + } + }, function (error) { + // On error, keep polling + console.warn('Transcoding status check failed:', error); + }); + }, 3000); // Poll every 3 seconds + } } function initDirective() { @@ -286,9 +331,17 @@ angular.module('streama').directive('streamaVideoPlayer', [ //Disable these shortcut keys for other pages. They are re-initialized when the user opens the player again. Mousetrap.reset(); + // Cancel transcoding poll interval if active + if (transcodingPollInterval) { + $interval.cancel(transcodingPollInterval); + transcodingPollInterval = null; + } + console.log("destroy"); - video.pause(); - video.src = ''; + if (video) { + video.pause(); + video.src = ''; + } $elem.find('video').children('source').prop('src', ''); $elem.find('video').remove().length = 0; } @@ -318,7 +371,8 @@ angular.module('streama').directive('streamaVideoPlayer', [ $scope.isNextVideoShowing = (nextVideoId && video.currentTime > videoOutroStart); } else { var remainingDurationSeconds = video.duration - video.currentTime; - $scope.isNextVideoShowing = (nextVideoId && remainingDurationSeconds < END_OF_VIDEO); + var endOfVideo = Math.min(Math.max(3, video.duration * 0.042), END_OF_VIDEO); + $scope.isNextVideoShowing = (nextVideoId && remainingDurationSeconds < endOfVideo); } } diff --git a/grails-app/assets/javascripts/streama/services/api-service.js b/grails-app/assets/javascripts/streama/services/api-service.js index 818f4f477..69bb861b8 100644 --- a/grails-app/assets/javascripts/streama/services/api-service.js +++ b/grails-app/assets/javascripts/streama/services/api-service.js @@ -63,6 +63,9 @@ angular.module('streama').factory('apiService', function ($http, $rootScope, con userActivity: { list: function (params) { return $http.get('userActivity.json', {params: params}); + }, + lastLogin: function () { + return $http.get('userActivity/lastLogin.json'); } }, @@ -165,10 +168,64 @@ angular.module('streama').factory('apiService', function ($http, $rootScope, con }, getURL: function (id) { return $http.get('file/getURL.json', {params: {id: id}}); + }, + transcodingStatus: function (id) { + return $http.get('file/transcodingStatus.json', {params: {id: id}}); + }, + triggerTranscoding: function (id) { + return $http.post('file/triggerTranscoding.json', {id: id}); } }, - episode: { + transcoding: { + status: function () { + return $http.get('transcoding/status.json'); + }, + pending: function () { + return $http.get('transcoding/pending.json'); + }, + list: function (params) { + return $http.get('transcoding/list.json', {params: params}); + }, + transcode: function (id) { + return $http.post('transcoding/transcode.json', {id: id}); + }, + transcodeAll: function () { + return $http.post('transcoding/transcodeAll.json'); + }, + clearCache: function (id) { + return $http.post('transcoding/clearCache.json', {id: id}); + }, + clearAllCache: function () { + return $http.post('transcoding/clearAllCache.json'); + }, + probe: function (id) { + return $http.post('transcoding/probe.json', {id: id}); + }, + probeAll: function () { + return $http.post('transcoding/probeAll.json'); + }, + cacheStats: function () { + return $http.get('transcoding/cacheStats.json'); + } + }, + + subtitle: { + setDefault: function(subtitleId, videoId) { + return $http.get('subtitles/setDefault.json', {params: {id: subtitleId, videoId: videoId}}); + }, + getOpensubtitles: function (video, videoTitle, subtitlelanguage, isSearchByHash) { + return $http.get('subtitles/get.json', {params: {episode: video.episode_number, query: videoTitle, season: video.season_number, subLanguageId: subtitlelanguage, videoId: video.id, searchByHash: isSearchByHash}}); + }, + uploadOpensubtitles: function (opensubtitle, videoId) { + return $http.get('subtitles/download.json', {params: {subFileName: opensubtitle.subFileName, subDownloadLink: opensubtitle.subDownloadLink, subLang: opensubtitle.languageName, videoId: videoId}}); + }, + refreshSubtitles: function (videoId) { + return $http.get('subtitles/getVideoSubtitles.json', {params: {videoId: videoId}}); + }, + }, + + episode: { get: function (id) { return $http.get('episode/show.json', {params: {id: id}}); }, @@ -233,7 +290,7 @@ angular.module('streama').factory('apiService', function ($http, $rootScope, con return $http.post('watchlistEntry/create.json', {params: {id: item.id, mediaType: item.mediaType}}); }, delete: function (item) { - return $http.delete('watchlistEntry/delete.json', {params: {id: item.id, mediaType: item.mediaType}}) + return $http.delete('watchlistEntry/delete.json', {params: {id: item.id, mediaType: item.mediaType}}); }, list: function (params) { return $http.get('watchlistEntry/list.json', {params: params}); @@ -246,6 +303,12 @@ angular.module('streama').factory('apiService', function ($http, $rootScope, con }, list: function () { return $http.get('genre.json'); + }, + create: function (name) { + return $http.post('genre/save', {name: name}); + }, + delete: function (id) { + return $http.delete('genre/delete', {params: {id: id}}); } }, @@ -320,8 +383,8 @@ angular.module('streama').factory('apiService', function ($http, $rootScope, con return $http.get('dash/searchMedia.json', {params: {query: query}}); }, - listContinueWatching: function () { - return $http.get('dash/listContinueWatching.json'); + listContinueWatching: function (params) { + return $http.get('dash/listContinueWatching.json', {params: params}); }, listMovies: function (params) { @@ -336,6 +399,10 @@ angular.module('streama').factory('apiService', function ($http, $rootScope, con return $http.get('dash/firstEpisodeForShow.json', {params: {id: id}}); }, + randomEpisodeForShow: function (id) { + return $http.get('dash/randomEpisodeForShow.json', {params: {id: id}}); + }, + listGenres: function () { return $http.get('dash/listGenres.json'); }, @@ -361,16 +428,16 @@ angular.module('streama').factory('apiService', function ($http, $rootScope, con profile: { save: function (params) { - return $http.post('profile/save', params) + return $http.post('profile/save', params); }, update: function (params) { - return $http.put('profile/update.json', params) + return $http.put('profile/update.json', params); }, delete: function (id) { - return $http.delete('profile/delete.json', {params: {id: id}}) + return $http.delete('profile/delete.json', {params: {id: id}}); }, getUserProfiles: function () { - return $http.get('profile/getUserProfiles.json') + return $http.get('profile/getUserProfiles.json'); } } diff --git a/grails-app/assets/javascripts/streama/services/languageCode.js b/grails-app/assets/javascripts/streama/services/languageCode.js new file mode 100644 index 000000000..e4d727df7 --- /dev/null +++ b/grails-app/assets/javascripts/streama/services/languageCode.js @@ -0,0 +1,3365 @@ +//= wrapped + +angular.module('streama').factory('languageData', languageData); + +function languageData() { + return [ + { + "IdSubLanguage": "", + "LanguageName": "All languages" + }, + { + "IdSubLanguage": "aar", + "ISO639": "aa", + "LanguageName": "Afar, afar", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "abk", + "ISO639": "ab", + "LanguageName": "Abkhazian", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ace", + "ISO639": "", + "LanguageName": "Achinese", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ach", + "ISO639": "", + "LanguageName": "Acoli", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ada", + "ISO639": "", + "LanguageName": "Adangme", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ady", + "ISO639": "", + "LanguageName": "adyghé", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "afa", + "ISO639": "", + "LanguageName": "Afro-Asiatic (Other)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "afh", + "ISO639": "", + "LanguageName": "Afrihili", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "afr", + "ISO639": "af", + "LanguageName": "Afrikaans", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ain", + "ISO639": "", + "LanguageName": "Ainu", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "aka", + "ISO639": "ak", + "LanguageName": "Akan", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "akk", + "ISO639": "", + "LanguageName": "Akkadian", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "alb", + "ISO639": "sq", + "LanguageName": "Albanian", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "ale", + "ISO639": "", + "LanguageName": "Aleut", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "alg", + "ISO639": "", + "LanguageName": "Algonquian languages", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "alt", + "ISO639": "", + "LanguageName": "Southern Altai", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "amh", + "ISO639": "am", + "LanguageName": "Amharic", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ang", + "ISO639": "", + "LanguageName": "English, Old (ca.450-1100)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "apa", + "ISO639": "", + "LanguageName": "Apache languages", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ara", + "ISO639": "ar", + "LanguageName": "Arabic", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "arc", + "ISO639": "", + "LanguageName": "Aramaic", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "arg", + "ISO639": "an", + "LanguageName": "Aragonese", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "arm", + "ISO639": "hy", + "LanguageName": "Armenian", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "arn", + "ISO639": "", + "LanguageName": "Araucanian", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "arp", + "ISO639": "", + "LanguageName": "Arapaho", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "art", + "ISO639": "", + "LanguageName": "Artificial (Other)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "arw", + "ISO639": "", + "LanguageName": "Arawak", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "asm", + "ISO639": "as", + "LanguageName": "Assamese", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ast", + "ISO639": "at", + "LanguageName": "Asturian", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "ath", + "ISO639": "", + "LanguageName": "Athapascan languages", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "aus", + "ISO639": "", + "LanguageName": "Australian languages", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ava", + "ISO639": "av", + "LanguageName": "Avaric", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ave", + "ISO639": "ae", + "LanguageName": "Avestan", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "awa", + "ISO639": "", + "LanguageName": "Awadhi", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "aym", + "ISO639": "ay", + "LanguageName": "Aymara", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "aze", + "ISO639": "az", + "LanguageName": "Azerbaijani", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "bad", + "ISO639": "", + "LanguageName": "Banda", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "bai", + "ISO639": "", + "LanguageName": "Bamileke languages", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "bak", + "ISO639": "ba", + "LanguageName": "Bashkir", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "bal", + "ISO639": "", + "LanguageName": "Baluchi", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "bam", + "ISO639": "bm", + "LanguageName": "Bambara", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ban", + "ISO639": "", + "LanguageName": "Balinese", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "baq", + "ISO639": "eu", + "LanguageName": "Basque", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "bas", + "ISO639": "", + "LanguageName": "Basa", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "bat", + "ISO639": "", + "LanguageName": "Baltic (Other)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "bej", + "ISO639": "", + "LanguageName": "Beja", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "bel", + "ISO639": "be", + "LanguageName": "Belarusian", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "bem", + "ISO639": "", + "LanguageName": "Bemba", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ben", + "ISO639": "bn", + "LanguageName": "Bengali", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ber", + "ISO639": "", + "LanguageName": "Berber (Other)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "bho", + "ISO639": "", + "LanguageName": "Bhojpuri", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "bih", + "ISO639": "bh", + "LanguageName": "Bihari", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "bik", + "ISO639": "", + "LanguageName": "Bikol", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "bin", + "ISO639": "", + "LanguageName": "Bini", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "bis", + "ISO639": "bi", + "LanguageName": "Bislama", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "bla", + "ISO639": "", + "LanguageName": "Siksika", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "bnt", + "ISO639": "", + "LanguageName": "Bantu (Other)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "bos", + "ISO639": "bs", + "LanguageName": "Bosnian", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "bra", + "ISO639": "", + "LanguageName": "Braj", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "bre", + "ISO639": "br", + "LanguageName": "Breton", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "btk", + "ISO639": "", + "LanguageName": "Batak (Indonesia)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "bua", + "ISO639": "", + "LanguageName": "Buriat", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "bug", + "ISO639": "", + "LanguageName": "Buginese", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "bul", + "ISO639": "bg", + "LanguageName": "Bulgarian", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "bur", + "ISO639": "my", + "LanguageName": "Burmese", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "byn", + "ISO639": "", + "LanguageName": "Blin", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "cad", + "ISO639": "", + "LanguageName": "Caddo", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "cai", + "ISO639": "", + "LanguageName": "Central American Indian (Other)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "car", + "ISO639": "", + "LanguageName": "Carib", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "cat", + "ISO639": "ca", + "LanguageName": "Catalan", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "cau", + "ISO639": "", + "LanguageName": "Caucasian (Other)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ceb", + "ISO639": "", + "LanguageName": "Cebuano", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "cel", + "ISO639": "", + "LanguageName": "Celtic (Other)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "cha", + "ISO639": "ch", + "LanguageName": "Chamorro", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "chb", + "ISO639": "", + "LanguageName": "Chibcha", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "che", + "ISO639": "ce", + "LanguageName": "Chechen", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "chg", + "ISO639": "", + "LanguageName": "Chagatai", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "chi", + "ISO639": "zh", + "LanguageName": "Chinese (simplified)", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "chk", + "ISO639": "", + "LanguageName": "Chuukese", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "chm", + "ISO639": "", + "LanguageName": "Mari", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "chn", + "ISO639": "", + "LanguageName": "Chinook jargon", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "cho", + "ISO639": "", + "LanguageName": "Choctaw", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "chp", + "ISO639": "", + "LanguageName": "Chipewyan", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "chr", + "ISO639": "", + "LanguageName": "Cherokee", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "chu", + "ISO639": "cu", + "LanguageName": "Church Slavic", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "chv", + "ISO639": "cv", + "LanguageName": "Chuvash", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "chy", + "ISO639": "", + "LanguageName": "Cheyenne", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "cmc", + "ISO639": "", + "LanguageName": "Chamic languages", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "cop", + "ISO639": "", + "LanguageName": "Coptic", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "cor", + "ISO639": "kw", + "LanguageName": "Cornish", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "cos", + "ISO639": "co", + "LanguageName": "Corsican", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "cpe", + "ISO639": "", + "LanguageName": "Creoles and pidgins, English based (Other)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "cpf", + "ISO639": "", + "LanguageName": "Creoles and pidgins, French-based (Other)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "cpp", + "ISO639": "", + "LanguageName": "Creoles and pidgins, Portuguese-based (Other)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "cre", + "ISO639": "cr", + "LanguageName": "Cree", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "crh", + "ISO639": "", + "LanguageName": "Crimean Tatar", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "crp", + "ISO639": "", + "LanguageName": "Creoles and pidgins (Other)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "csb", + "ISO639": "", + "LanguageName": "Kashubian", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "cus", + "ISO639": "", + "LanguageName": "Cushitic (Other)' couchitiques, autres langues", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "cze", + "ISO639": "cs", + "LanguageName": "Czech", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "dak", + "ISO639": "", + "LanguageName": "Dakota", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "dan", + "ISO639": "da", + "LanguageName": "Danish", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "dar", + "ISO639": "", + "LanguageName": "Dargwa", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "day", + "ISO639": "", + "LanguageName": "Dayak", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "del", + "ISO639": "", + "LanguageName": "Delaware", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "den", + "ISO639": "", + "LanguageName": "Slave (Athapascan)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "dgr", + "ISO639": "", + "LanguageName": "Dogrib", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "din", + "ISO639": "", + "LanguageName": "Dinka", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "div", + "ISO639": "dv", + "LanguageName": "Divehi", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "doi", + "ISO639": "", + "LanguageName": "Dogri", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "dra", + "ISO639": "", + "LanguageName": "Dravidian (Other)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "dua", + "ISO639": "", + "LanguageName": "Duala", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "dum", + "ISO639": "", + "LanguageName": "Dutch, Middle (ca.1050-1350)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "dut", + "ISO639": "nl", + "LanguageName": "Dutch", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "dyu", + "ISO639": "", + "LanguageName": "Dyula", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "dzo", + "ISO639": "dz", + "LanguageName": "Dzongkha", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "efi", + "ISO639": "", + "LanguageName": "Efik", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "egy", + "ISO639": "", + "LanguageName": "Egyptian (Ancient)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "eka", + "ISO639": "", + "LanguageName": "Ekajuk", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "elx", + "ISO639": "", + "LanguageName": "Elamite", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "eng", + "ISO639": "en", + "LanguageName": "English", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "enm", + "ISO639": "", + "LanguageName": "English, Middle (1100-1500)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "epo", + "ISO639": "eo", + "LanguageName": "Esperanto", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "est", + "ISO639": "et", + "LanguageName": "Estonian", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "ewe", + "ISO639": "ee", + "LanguageName": "Ewe", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ewo", + "ISO639": "", + "LanguageName": "Ewondo", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "fan", + "ISO639": "", + "LanguageName": "Fang", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "fao", + "ISO639": "fo", + "LanguageName": "Faroese", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "fat", + "ISO639": "", + "LanguageName": "Fanti", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "fij", + "ISO639": "fj", + "LanguageName": "Fijian", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "fil", + "ISO639": "", + "LanguageName": "Filipino", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "fin", + "ISO639": "fi", + "LanguageName": "Finnish", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "fiu", + "ISO639": "", + "LanguageName": "Finno-Ugrian (Other)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "fon", + "ISO639": "", + "LanguageName": "Fon", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "fre", + "ISO639": "fr", + "LanguageName": "French", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "frm", + "ISO639": "", + "LanguageName": "French, Middle (ca.1400-1600)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "fro", + "ISO639": "", + "LanguageName": "French, Old (842-ca.1400)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "fry", + "ISO639": "fy", + "LanguageName": "Frisian", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ful", + "ISO639": "ff", + "LanguageName": "Fulah", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "fur", + "ISO639": "", + "LanguageName": "Friulian", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "gaa", + "ISO639": "", + "LanguageName": "Ga", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "gay", + "ISO639": "", + "LanguageName": "Gayo", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "gba", + "ISO639": "", + "LanguageName": "Gbaya", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "gem", + "ISO639": "", + "LanguageName": "Germanic (Other)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "geo", + "ISO639": "ka", + "LanguageName": "Georgian", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "ger", + "ISO639": "de", + "LanguageName": "German", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "gez", + "ISO639": "", + "LanguageName": "Geez", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "gil", + "ISO639": "", + "LanguageName": "Gilbertese", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "gla", + "ISO639": "gd", + "LanguageName": "Gaelic", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "gle", + "ISO639": "ga", + "LanguageName": "Irish", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "glg", + "ISO639": "gl", + "LanguageName": "Galician", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "glv", + "ISO639": "gv", + "LanguageName": "Manx", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "gmh", + "ISO639": "", + "LanguageName": "German, Middle High (ca.1050-1500)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "goh", + "ISO639": "", + "LanguageName": "German, Old High (ca.750-1050)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "gon", + "ISO639": "", + "LanguageName": "Gondi", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "gor", + "ISO639": "", + "LanguageName": "Gorontalo", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "got", + "ISO639": "", + "LanguageName": "Gothic", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "grb", + "ISO639": "", + "LanguageName": "Grebo", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "grc", + "ISO639": "", + "LanguageName": "Greek, Ancient (to 1453)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ell", + "ISO639": "el", + "LanguageName": "Greek", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "grn", + "ISO639": "gn", + "LanguageName": "Guarani", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "guj", + "ISO639": "gu", + "LanguageName": "Gujarati", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "gwi", + "ISO639": "", + "LanguageName": "Gwich´in", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "hai", + "ISO639": "", + "LanguageName": "Haida", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "hat", + "ISO639": "ht", + "LanguageName": "Haitian", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "hau", + "ISO639": "ha", + "LanguageName": "Hausa", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "haw", + "ISO639": "", + "LanguageName": "Hawaiian", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "heb", + "ISO639": "he", + "LanguageName": "Hebrew", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "her", + "ISO639": "hz", + "LanguageName": "Herero", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "hil", + "ISO639": "", + "LanguageName": "Hiligaynon", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "him", + "ISO639": "", + "LanguageName": "Himachali", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "hin", + "ISO639": "hi", + "LanguageName": "Hindi", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "hit", + "ISO639": "", + "LanguageName": "Hittite", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "hmn", + "ISO639": "", + "LanguageName": "Hmong", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "hmo", + "ISO639": "ho", + "LanguageName": "Hiri Motu", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "hrv", + "ISO639": "hr", + "LanguageName": "Croatian", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "hun", + "ISO639": "hu", + "LanguageName": "Hungarian", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "hup", + "ISO639": "", + "LanguageName": "Hupa", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "iba", + "ISO639": "", + "LanguageName": "Iban", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ibo", + "ISO639": "ig", + "LanguageName": "Igbo", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ice", + "ISO639": "is", + "LanguageName": "Icelandic", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "ido", + "ISO639": "io", + "LanguageName": "Ido", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "iii", + "ISO639": "ii", + "LanguageName": "Sichuan Yi", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ijo", + "ISO639": "", + "LanguageName": "Ijo", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "iku", + "ISO639": "iu", + "LanguageName": "Inuktitut", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ile", + "ISO639": "ie", + "LanguageName": "Interlingue", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ilo", + "ISO639": "", + "LanguageName": "Iloko", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ina", + "ISO639": "ia", + "LanguageName": "Interlingua", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "inc", + "ISO639": "", + "LanguageName": "Indic (Other)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ind", + "ISO639": "id", + "LanguageName": "Indonesian", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "ine", + "ISO639": "", + "LanguageName": "Indo-European (Other)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "inh", + "ISO639": "", + "LanguageName": "Ingush", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ipk", + "ISO639": "ik", + "LanguageName": "Inupiaq", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ira", + "ISO639": "", + "LanguageName": "Iranian (Other)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "iro", + "ISO639": "", + "LanguageName": "Iroquoian languages", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ita", + "ISO639": "it", + "LanguageName": "Italian", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "jav", + "ISO639": "jv", + "LanguageName": "Javanese", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "jpn", + "ISO639": "ja", + "LanguageName": "Japanese", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "jpr", + "ISO639": "", + "LanguageName": "Judeo-Persian", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "jrb", + "ISO639": "", + "LanguageName": "Judeo-Arabic", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "kaa", + "ISO639": "", + "LanguageName": "Kara-Kalpak", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "kab", + "ISO639": "", + "LanguageName": "Kabyle", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "kac", + "ISO639": "", + "LanguageName": "Kachin", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "kal", + "ISO639": "kl", + "LanguageName": "Kalaallisut", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "kam", + "ISO639": "", + "LanguageName": "Kamba", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "kan", + "ISO639": "kn", + "LanguageName": "Kannada", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "kar", + "ISO639": "", + "LanguageName": "Karen", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "kas", + "ISO639": "ks", + "LanguageName": "Kashmiri", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "kau", + "ISO639": "kr", + "LanguageName": "Kanuri", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "kaw", + "ISO639": "", + "LanguageName": "Kawi", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "kaz", + "ISO639": "kk", + "LanguageName": "Kazakh", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "kbd", + "ISO639": "", + "LanguageName": "Kabardian", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "kha", + "ISO639": "", + "LanguageName": "Khasi", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "khi", + "ISO639": "", + "LanguageName": "Khoisan (Other)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "khm", + "ISO639": "km", + "LanguageName": "Khmer", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "kho", + "ISO639": "", + "LanguageName": "Khotanese", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "kik", + "ISO639": "ki", + "LanguageName": "Kikuyu", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "kin", + "ISO639": "rw", + "LanguageName": "Kinyarwanda", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "kir", + "ISO639": "ky", + "LanguageName": "Kirghiz", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "kmb", + "ISO639": "", + "LanguageName": "Kimbundu", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "kok", + "ISO639": "", + "LanguageName": "Konkani", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "kom", + "ISO639": "kv", + "LanguageName": "Komi", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "kon", + "ISO639": "kg", + "LanguageName": "Kongo", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "kor", + "ISO639": "ko", + "LanguageName": "Korean", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "kos", + "ISO639": "", + "LanguageName": "Kosraean", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "kpe", + "ISO639": "", + "LanguageName": "Kpelle", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "krc", + "ISO639": "", + "LanguageName": "Karachay-Balkar", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "kro", + "ISO639": "", + "LanguageName": "Kru", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "kru", + "ISO639": "", + "LanguageName": "Kurukh", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "kua", + "ISO639": "kj", + "LanguageName": "Kuanyama", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "kum", + "ISO639": "", + "LanguageName": "Kumyk", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "kur", + "ISO639": "ku", + "LanguageName": "Kurdish", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "kut", + "ISO639": "", + "LanguageName": "Kutenai", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "lad", + "ISO639": "", + "LanguageName": "Ladino", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "lah", + "ISO639": "", + "LanguageName": "Lahnda", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "lam", + "ISO639": "", + "LanguageName": "Lamba", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "lao", + "ISO639": "lo", + "LanguageName": "Lao", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "lat", + "ISO639": "la", + "LanguageName": "Latin", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "lav", + "ISO639": "lv", + "LanguageName": "Latvian", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "lez", + "ISO639": "", + "LanguageName": "Lezghian", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "lim", + "ISO639": "li", + "LanguageName": "Limburgan", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "lin", + "ISO639": "ln", + "LanguageName": "Lingala", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "lit", + "ISO639": "lt", + "LanguageName": "Lithuanian", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "lol", + "ISO639": "", + "LanguageName": "Mongo", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "loz", + "ISO639": "", + "LanguageName": "Lozi", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ltz", + "ISO639": "lb", + "LanguageName": "Luxembourgish", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "lua", + "ISO639": "", + "LanguageName": "Luba-Lulua", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "lub", + "ISO639": "lu", + "LanguageName": "Luba-Katanga", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "lug", + "ISO639": "lg", + "LanguageName": "Ganda", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "lui", + "ISO639": "", + "LanguageName": "Luiseno", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "lun", + "ISO639": "", + "LanguageName": "Lunda", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "luo", + "ISO639": "", + "LanguageName": "Luo (Kenya and Tanzania)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "lus", + "ISO639": "", + "LanguageName": "lushai", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "mac", + "ISO639": "mk", + "LanguageName": "Macedonian", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "mad", + "ISO639": "", + "LanguageName": "Madurese", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "mag", + "ISO639": "", + "LanguageName": "Magahi", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "mah", + "ISO639": "mh", + "LanguageName": "Marshallese", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "mai", + "ISO639": "", + "LanguageName": "Maithili", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "mak", + "ISO639": "", + "LanguageName": "Makasar", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "mal", + "ISO639": "ml", + "LanguageName": "Malayalam", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "man", + "ISO639": "", + "LanguageName": "Mandingo", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "mao", + "ISO639": "mi", + "LanguageName": "Maori", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "map", + "ISO639": "", + "LanguageName": "Austronesian (Other)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "mar", + "ISO639": "mr", + "LanguageName": "Marathi", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "mas", + "ISO639": "", + "LanguageName": "Masai", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "may", + "ISO639": "ms", + "LanguageName": "Malay", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "mdf", + "ISO639": "", + "LanguageName": "Moksha", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "mdr", + "ISO639": "", + "LanguageName": "Mandar", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "men", + "ISO639": "", + "LanguageName": "Mende", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "mga", + "ISO639": "", + "LanguageName": "Irish, Middle (900-1200)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "mic", + "ISO639": "", + "LanguageName": "Mi'kmaq", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "min", + "ISO639": "", + "LanguageName": "Minangkabau", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "mis", + "ISO639": "", + "LanguageName": "Miscellaneous languages", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "mkh", + "ISO639": "", + "LanguageName": "Mon-Khmer (Other)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "mlg", + "ISO639": "mg", + "LanguageName": "Malagasy", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "mlt", + "ISO639": "mt", + "LanguageName": "Maltese", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "mnc", + "ISO639": "", + "LanguageName": "Manchu", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "mni", + "ISO639": "ma", + "LanguageName": "Manipuri", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "mno", + "ISO639": "", + "LanguageName": "Manobo languages", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "moh", + "ISO639": "", + "LanguageName": "Mohawk", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "mol", + "ISO639": "mo", + "LanguageName": "Moldavian", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "mon", + "ISO639": "mn", + "LanguageName": "Mongolian", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "mos", + "ISO639": "", + "LanguageName": "Mossi", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "mwl", + "ISO639": "", + "LanguageName": "Mirandese", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "mul", + "ISO639": "", + "LanguageName": "Multiple languages", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "mun", + "ISO639": "", + "LanguageName": "Munda languages", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "mus", + "ISO639": "", + "LanguageName": "Creek", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "mwr", + "ISO639": "", + "LanguageName": "Marwari", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "myn", + "ISO639": "", + "LanguageName": "Mayan languages", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "myv", + "ISO639": "", + "LanguageName": "Erzya", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "nah", + "ISO639": "", + "LanguageName": "Nahuatl", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "nai", + "ISO639": "", + "LanguageName": "North American Indian", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "nap", + "ISO639": "", + "LanguageName": "Neapolitan", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "nau", + "ISO639": "na", + "LanguageName": "Nauru", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "nav", + "ISO639": "nv", + "LanguageName": "Navajo", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "nbl", + "ISO639": "nr", + "LanguageName": "Ndebele, South", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "nde", + "ISO639": "nd", + "LanguageName": "Ndebele, North", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ndo", + "ISO639": "ng", + "LanguageName": "Ndonga", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "nds", + "ISO639": "", + "LanguageName": "Low German", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "nep", + "ISO639": "ne", + "LanguageName": "Nepali", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "new", + "ISO639": "", + "LanguageName": "Nepal Bhasa", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "nia", + "ISO639": "", + "LanguageName": "Nias", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "nic", + "ISO639": "", + "LanguageName": "Niger-Kordofanian (Other)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "niu", + "ISO639": "", + "LanguageName": "Niuean", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "nno", + "ISO639": "nn", + "LanguageName": "Norwegian Nynorsk", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "nob", + "ISO639": "nb", + "LanguageName": "Norwegian Bokmal", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "nog", + "ISO639": "", + "LanguageName": "Nogai", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "non", + "ISO639": "", + "LanguageName": "Norse, Old", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "nor", + "ISO639": "no", + "LanguageName": "Norwegian", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "nso", + "ISO639": "", + "LanguageName": "Northern Sotho", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "nub", + "ISO639": "", + "LanguageName": "Nubian languages", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "nwc", + "ISO639": "", + "LanguageName": "Classical Newari", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "nya", + "ISO639": "ny", + "LanguageName": "Chichewa", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "nym", + "ISO639": "", + "LanguageName": "Nyamwezi", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "nyn", + "ISO639": "", + "LanguageName": "Nyankole", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "nyo", + "ISO639": "", + "LanguageName": "Nyoro", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "nzi", + "ISO639": "", + "LanguageName": "Nzima", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "oci", + "ISO639": "oc", + "LanguageName": "Occitan", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "oji", + "ISO639": "oj", + "LanguageName": "Ojibwa", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ori", + "ISO639": "or", + "LanguageName": "Odia", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "orm", + "ISO639": "om", + "LanguageName": "Oromo", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "osa", + "ISO639": "", + "LanguageName": "Osage", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "oss", + "ISO639": "os", + "LanguageName": "Ossetian", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ota", + "ISO639": "", + "LanguageName": "Turkish, Ottoman (1500-1928)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "oto", + "ISO639": "", + "LanguageName": "Otomian languages", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "paa", + "ISO639": "", + "LanguageName": "Papuan (Other)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "pag", + "ISO639": "", + "LanguageName": "Pangasinan", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "pal", + "ISO639": "", + "LanguageName": "Pahlavi", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "pam", + "ISO639": "", + "LanguageName": "Pampanga", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "pan", + "ISO639": "pa", + "LanguageName": "Panjabi", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "pap", + "ISO639": "", + "LanguageName": "Papiamento", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "pau", + "ISO639": "", + "LanguageName": "Palauan", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "peo", + "ISO639": "", + "LanguageName": "Persian, Old (ca.600-400 B.C.)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "per", + "ISO639": "fa", + "LanguageName": "Persian", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "phi", + "ISO639": "", + "LanguageName": "Philippine (Other)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "phn", + "ISO639": "", + "LanguageName": "Phoenician", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "pli", + "ISO639": "pi", + "LanguageName": "Pali", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "pol", + "ISO639": "pl", + "LanguageName": "Polish", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "pon", + "ISO639": "", + "LanguageName": "Pohnpeian", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "por", + "ISO639": "pt", + "LanguageName": "Portuguese", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "pra", + "ISO639": "", + "LanguageName": "Prakrit languages", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "pro", + "ISO639": "", + "LanguageName": "Provençal, Old (to 1500)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "pus", + "ISO639": "ps", + "LanguageName": "Pushto", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "que", + "ISO639": "qu", + "LanguageName": "Quechua", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "raj", + "ISO639": "", + "LanguageName": "Rajasthani", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "rap", + "ISO639": "", + "LanguageName": "Rapanui", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "rar", + "ISO639": "", + "LanguageName": "Rarotongan", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "roa", + "ISO639": "", + "LanguageName": "Romance (Other)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "roh", + "ISO639": "rm", + "LanguageName": "Raeto-Romance", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "rom", + "ISO639": "", + "LanguageName": "Romany", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "run", + "ISO639": "rn", + "LanguageName": "Rundi", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "rup", + "ISO639": "", + "LanguageName": "Aromanian", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "rus", + "ISO639": "ru", + "LanguageName": "Russian", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "sad", + "ISO639": "", + "LanguageName": "Sandawe", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "sag", + "ISO639": "sg", + "LanguageName": "Sango", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "sah", + "ISO639": "", + "LanguageName": "Yakut", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "sai", + "ISO639": "", + "LanguageName": "South American Indian (Other)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "sal", + "ISO639": "", + "LanguageName": "Salishan languages", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "sam", + "ISO639": "", + "LanguageName": "Samaritan Aramaic", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "san", + "ISO639": "sa", + "LanguageName": "Sanskrit", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "sas", + "ISO639": "", + "LanguageName": "Sasak", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "sat", + "ISO639": "", + "LanguageName": "Santali", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "scc", + "ISO639": "sr", + "LanguageName": "Serbian", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "scn", + "ISO639": "", + "LanguageName": "Sicilian", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "sco", + "ISO639": "", + "LanguageName": "Scots", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "sel", + "ISO639": "", + "LanguageName": "Selkup", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "sem", + "ISO639": "", + "LanguageName": "Semitic (Other)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "sga", + "ISO639": "", + "LanguageName": "Irish, Old (to 900)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "sgn", + "ISO639": "", + "LanguageName": "Sign Languages", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "shn", + "ISO639": "", + "LanguageName": "Shan", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "sid", + "ISO639": "", + "LanguageName": "Sidamo", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "sin", + "ISO639": "si", + "LanguageName": "Sinhalese", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "sio", + "ISO639": "", + "LanguageName": "Siouan languages", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "sit", + "ISO639": "", + "LanguageName": "Sino-Tibetan (Other)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "sla", + "ISO639": "", + "LanguageName": "Slavic (Other)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "slo", + "ISO639": "sk", + "LanguageName": "Slovak", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "slv", + "ISO639": "sl", + "LanguageName": "Slovenian", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "sma", + "ISO639": "", + "LanguageName": "Southern Sami", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "sme", + "ISO639": "se", + "LanguageName": "Northern Sami", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "smi", + "ISO639": "", + "LanguageName": "Sami languages (Other)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "smj", + "ISO639": "", + "LanguageName": "Lule Sami", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "smn", + "ISO639": "", + "LanguageName": "Inari Sami", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "smo", + "ISO639": "sm", + "LanguageName": "Samoan", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "sms", + "ISO639": "", + "LanguageName": "Skolt Sami", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "sna", + "ISO639": "sn", + "LanguageName": "Shona", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "snd", + "ISO639": "sd", + "LanguageName": "Sindhi", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "snk", + "ISO639": "", + "LanguageName": "Soninke", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "sog", + "ISO639": "", + "LanguageName": "Sogdian", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "som", + "ISO639": "so", + "LanguageName": "Somali", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "son", + "ISO639": "", + "LanguageName": "Songhai", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "sot", + "ISO639": "st", + "LanguageName": "Sotho, Southern", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "spa", + "ISO639": "es", + "LanguageName": "Spanish", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "srd", + "ISO639": "sc", + "LanguageName": "Sardinian", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "srr", + "ISO639": "", + "LanguageName": "Serer", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ssa", + "ISO639": "", + "LanguageName": "Nilo-Saharan (Other)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ssw", + "ISO639": "ss", + "LanguageName": "Swati", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "suk", + "ISO639": "", + "LanguageName": "Sukuma", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "sun", + "ISO639": "su", + "LanguageName": "Sundanese", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "sus", + "ISO639": "", + "LanguageName": "Susu", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "sux", + "ISO639": "", + "LanguageName": "Sumerian", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "swa", + "ISO639": "sw", + "LanguageName": "Swahili", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "swe", + "ISO639": "sv", + "LanguageName": "Swedish", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "syr", + "ISO639": "sy", + "LanguageName": "Syriac", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "tah", + "ISO639": "ty", + "LanguageName": "Tahitian", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "tai", + "ISO639": "", + "LanguageName": "Tai (Other)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "tam", + "ISO639": "ta", + "LanguageName": "Tamil", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "tat", + "ISO639": "tt", + "LanguageName": "Tatar", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "tel", + "ISO639": "te", + "LanguageName": "Telugu", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "tem", + "ISO639": "", + "LanguageName": "Timne", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ter", + "ISO639": "", + "LanguageName": "Tereno", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "tet", + "ISO639": "", + "LanguageName": "Tetum", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "tgk", + "ISO639": "tg", + "LanguageName": "Tajik", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "tgl", + "ISO639": "tl", + "LanguageName": "Tagalog", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "tha", + "ISO639": "th", + "LanguageName": "Thai", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "tib", + "ISO639": "bo", + "LanguageName": "Tibetan", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "tig", + "ISO639": "", + "LanguageName": "Tigre", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "tir", + "ISO639": "ti", + "LanguageName": "Tigrinya", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "tiv", + "ISO639": "", + "LanguageName": "Tiv", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "tkl", + "ISO639": "", + "LanguageName": "Tokelau", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "tlh", + "ISO639": "", + "LanguageName": "Klingon", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "tli", + "ISO639": "", + "LanguageName": "Tlingit", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "tmh", + "ISO639": "", + "LanguageName": "Tamashek", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "tog", + "ISO639": "", + "LanguageName": "Tonga (Nyasa)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ton", + "ISO639": "to", + "LanguageName": "Tonga (Tonga Islands)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "tpi", + "ISO639": "", + "LanguageName": "Tok Pisin", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "tsi", + "ISO639": "", + "LanguageName": "Tsimshian", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "tsn", + "ISO639": "tn", + "LanguageName": "Tswana", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "tso", + "ISO639": "ts", + "LanguageName": "Tsonga", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "tuk", + "ISO639": "tk", + "LanguageName": "Turkmen", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "tum", + "ISO639": "", + "LanguageName": "Tumbuka", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "tup", + "ISO639": "", + "LanguageName": "Tupi languages", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "tur", + "ISO639": "tr", + "LanguageName": "Turkish", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "tut", + "ISO639": "", + "LanguageName": "Altaic (Other)", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "tvl", + "ISO639": "", + "LanguageName": "Tuvalu", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "twi", + "ISO639": "tw", + "LanguageName": "Twi", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "tyv", + "ISO639": "", + "LanguageName": "Tuvinian", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "udm", + "ISO639": "", + "LanguageName": "Udmurt", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "uga", + "ISO639": "", + "LanguageName": "Ugaritic", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "uig", + "ISO639": "ug", + "LanguageName": "Uighur", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ukr", + "ISO639": "uk", + "LanguageName": "Ukrainian", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "umb", + "ISO639": "", + "LanguageName": "Umbundu", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "und", + "ISO639": "", + "LanguageName": "Undetermined", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "urd", + "ISO639": "ur", + "LanguageName": "Urdu", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "uzb", + "ISO639": "uz", + "LanguageName": "Uzbek", + "UploadEnabled": "0", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "vai", + "ISO639": "", + "LanguageName": "Vai", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ven", + "ISO639": "ve", + "LanguageName": "Venda", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "vie", + "ISO639": "vi", + "LanguageName": "Vietnamese", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "vol", + "ISO639": "vo", + "LanguageName": "Volapük", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "vot", + "ISO639": "", + "LanguageName": "Votic", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "wak", + "ISO639": "", + "LanguageName": "Wakashan languages", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "wal", + "ISO639": "", + "LanguageName": "Walamo", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "war", + "ISO639": "", + "LanguageName": "Waray", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "was", + "ISO639": "", + "LanguageName": "Washo", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "wel", + "ISO639": "cy", + "LanguageName": "Welsh", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "wen", + "ISO639": "", + "LanguageName": "Sorbian languages", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "wln", + "ISO639": "wa", + "LanguageName": "Walloon", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "wol", + "ISO639": "wo", + "LanguageName": "Wolof", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "xal", + "ISO639": "", + "LanguageName": "Kalmyk", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "xho", + "ISO639": "xh", + "LanguageName": "Xhosa", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "yao", + "ISO639": "", + "LanguageName": "Yao", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "yap", + "ISO639": "", + "LanguageName": "Yapese", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "yid", + "ISO639": "yi", + "LanguageName": "Yiddish", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "yor", + "ISO639": "yo", + "LanguageName": "Yoruba", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ypk", + "ISO639": "", + "LanguageName": "Yupik languages", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "zap", + "ISO639": "", + "LanguageName": "Zapotec", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "zen", + "ISO639": "", + "LanguageName": "Zenaga", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "zha", + "ISO639": "za", + "LanguageName": "Zhuang", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "znd", + "ISO639": "", + "LanguageName": "Zande", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "zul", + "ISO639": "zu", + "LanguageName": "Zulu", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "zun", + "ISO639": "", + "LanguageName": "Zuni", + "UploadEnabled": "0", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "rum", + "ISO639": "ro", + "LanguageName": "Romanian", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "pob", + "ISO639": "pb", + "LanguageName": "Portuguese (BR)", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "mne", + "ISO639": "me", + "LanguageName": "Montenegrin", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "zht", + "ISO639": "zt", + "LanguageName": "Chinese (traditional)", + "UploadEnabled": "1", + "WebEnabled": "1" + }, + { + "IdSubLanguage": "zhe", + "ISO639": "ze", + "LanguageName": "Chinese bilingual", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "pom", + "ISO639": "pm", + "LanguageName": "Portuguese (MZ)", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "ext", + "ISO639": "ex", + "LanguageName": "Extremaduran", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "spl", + "ISO639": "ea", + "LanguageName": "Spanish (LA)", + "UploadEnabled": "1", + "WebEnabled": "0" + }, + { + "IdSubLanguage": "spn", + "ISO639": "sp", + "LanguageName": "Spanish (EU)", + "UploadEnabled": "1", + "WebEnabled": "0" + } + ] +} diff --git a/grails-app/assets/javascripts/streama/services/modal-service.js b/grails-app/assets/javascripts/streama/services/modal-service.js index b202ca403..4489fae97 100644 --- a/grails-app/assets/javascripts/streama/services/modal-service.js +++ b/grails-app/assets/javascripts/streama/services/modal-service.js @@ -15,6 +15,7 @@ function modalService($uibModal, $state) { userCreateModal: userCreateModal, userInviteModal: userInviteModal, fileManagerModal: fileManagerModal, + openSubtitlesManagerModal: openSubtitlesManagerModal, newReleaseModal: newReleaseModal, mediaDetailModal: mediaDetailModal, openPlaybackOptions: openPlaybackOptions, @@ -186,7 +187,7 @@ function modalService($uibModal, $state) { }); } - function fileManagerModal (video, callback) { + function fileManagerModal (video, episodes, callback) { var modalInstance = $uibModal.open({ templateUrl: '/streama/modal--manage-files.htm', controller: 'modalFileCtrl', @@ -196,6 +197,9 @@ function modalService($uibModal, $state) { resolve: { video: function () { return video; + }, + episodes: function () { + return episodes; } } }); @@ -205,6 +209,25 @@ function modalService($uibModal, $state) { }); } + function openSubtitlesManagerModal (video, callback) { + var modalInstance = $uibModal.open({ + templateUrl: '/streama/modal--manage-opensubtitles.htm', + controller: 'modalOpensubtitleCtrl', + size: 'lg', + backdrop: 'static', + keyboard: false, + resolve: { + video: function () { + return video; + } + } + }); + + modalInstance.result.then(function (data) { + (callback || angular.noop)(data); + }); + } + function newReleaseModal (media, type, episodes, callback) { var modalInstance = $uibModal.open({ templateUrl: '/streama/modal--new-release.htm', @@ -290,7 +313,7 @@ function modalService($uibModal, $state) { return modalInstance.result; } - + function openPlaybackOptions(playerOptions) { var modalInstance = $uibModal.open({ templateUrl: '/streama/modal--playback-options.htm', diff --git a/grails-app/assets/javascripts/streama/streama.routes.js b/grails-app/assets/javascripts/streama/streama.routes.js index 7fbbfa874..62e86ec06 100644 --- a/grails-app/assets/javascripts/streama/streama.routes.js +++ b/grails-app/assets/javascripts/streama/streama.routes.js @@ -111,6 +111,21 @@ angular.module('streama').config(function ($stateProvider) { controller: 'adminReportsCtrl', controllerAs: "vm" }) + .state('admin.genres', { + url: '/genres', + templateUrl: '/streama/admin-genres.htm', + controller: 'adminGenresCtrl', + controllerAs: "vm" + }) + .state('admin.transcoding', { + url: '/transcoding', + templateUrl: '/streama/admin-transcoding.htm', + controller: 'adminTranscodingCtrl', + controllerAs: "vm", + resolve: { + currentUser: checkPermissionAdmin + } + }) diff --git a/grails-app/assets/javascripts/streama/streama.translations.js b/grails-app/assets/javascripts/streama/streama.translations.js index 1546d53dc..d04eea9f4 100644 --- a/grails-app/assets/javascripts/streama/streama.translations.js +++ b/grails-app/assets/javascripts/streama/streama.translations.js @@ -3,12 +3,32 @@ //= require_self //= require_tree translations -angular.module('streama.translations', ['pascalprecht.translate']) - .config(function ($translateProvider) { - $translateProvider.determinePreferredLanguage(); - $translateProvider.fallbackLanguage('en'); - }) +angular + .module("streama.translations", ["pascalprecht.translate"]) + .config(function ($translateProvider) { + $translateProvider.determinePreferredLanguage(); + $translateProvider.fallbackLanguage("en"); + }) - .run(function ($rootScope) { - $rootScope.availableLanguages = ['en', 'fr', 'es', 'de', 'kr', 'nl', 'pt', 'da', 'ja', 'it', 'ar', 'ru', 'cn', 'hu']; - }); + .run(function ($rootScope) { + $rootScope.availableLanguages = [ + "en", + "fr", + "es", + "cat", + "de", + 'hr', + "kr", + "nl", + "pt", + "da", + "ja", + "it", + "ar", + "ru", + "cn", + "hu", + "tr", + "sk", + ]; + }); diff --git a/grails-app/assets/javascripts/streama/templates/admin-fileManager.tpl.htm b/grails-app/assets/javascripts/streama/templates/admin-fileManager.tpl.htm index 6965ba48f..708538886 100644 --- a/grails-app/assets/javascripts/streama/templates/admin-fileManager.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/admin-fileManager.tpl.htm @@ -3,7 +3,7 @@

- File Manager + File Manager ({{filesCount}} items)

@@ -68,7 +68,7 @@

{{file.contentType}} {{file.fileExists}} -
+
None
diff --git a/grails-app/assets/javascripts/streama/templates/admin-genres.tpl.htm b/grails-app/assets/javascripts/streama/templates/admin-genres.tpl.htm new file mode 100644 index 000000000..a5fc1e8aa --- /dev/null +++ b/grails-app/assets/javascripts/streama/templates/admin-genres.tpl.htm @@ -0,0 +1,44 @@ + +
+
+

Genre ({{vm.genres.length}} items)

+

Here you can manage the genres for Videos / TvShows.

+

Usually, Genre are automatically added alongside TMDb-videos & shows. But if TMDb isn't enabled or you want to add your own custom Genres, you can do so here.

+
+
+
+ +
+
+ + +
+ + + + + + + + + + + + + + + + +
IDExternal-IDName
+ {{genre.id}} + + + CUSTOM + + {{genre.name}} + + +
+ + +
diff --git a/grails-app/assets/javascripts/streama/templates/admin-movie.tpl.htm b/grails-app/assets/javascripts/streama/templates/admin-movie.tpl.htm index 5fad70a53..2198c258c 100644 --- a/grails-app/assets/javascripts/streama/templates/admin-movie.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/admin-movie.tpl.htm @@ -113,8 +113,7 @@

- - +
@@ -146,7 +145,7 @@

Suggested by TheMovieDb.org
- +
Release: {{movie.release_date.substring(0, 4)}} | {{movie.vote_average}}
diff --git a/grails-app/assets/javascripts/streama/templates/admin-movies.tpl.htm b/grails-app/assets/javascripts/streama/templates/admin-movies.tpl.htm index ac59e8791..30b56c5a2 100644 --- a/grails-app/assets/javascripts/streama/templates/admin-movies.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/admin-movies.tpl.htm @@ -1,7 +1,8 @@

- Movies + Movies ({{vm.movie.total}} items) +

Want to add a new Movie?
- +
Release: {{::movie.release_date.substring(0, 4)}} | {{::movie.vote_average}}
diff --git a/grails-app/assets/javascripts/streama/templates/admin-new-releases.tpl.htm b/grails-app/assets/javascripts/streama/templates/admin-new-releases.tpl.htm index dcc90458a..d377852c7 100644 --- a/grails-app/assets/javascripts/streama/templates/admin-new-releases.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/admin-new-releases.tpl.htm @@ -24,8 +24,9 @@

Dashboard Highlights

{{notification.dateCreated | date:'short'}} - - {{notification.media.title || notification.media.name}} ({{notification.media.release_date.substring(0,4)}}) + + {{notification.media.title || notification.media.name}} + ({{notification.media.release_date.substring(0,4)}}) {{notification.description}} diff --git a/grails-app/assets/javascripts/streama/templates/admin-notifications.tpl.htm b/grails-app/assets/javascripts/streama/templates/admin-notifications.tpl.htm index 87f8b1611..a7d3638a0 100644 --- a/grails-app/assets/javascripts/streama/templates/admin-notifications.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/admin-notifications.tpl.htm @@ -30,11 +30,11 @@

Notification Queue

{{notification.dateCreated | date:'short'}} - + {{notification.movie.title}} ({{notification.movie.release_date.substring(0,4)}}) - + {{notification.tvShow.name}} ({{notification.tvShow.first_air_date.substring(0,4)}}) {{notification.description}} diff --git a/grails-app/assets/javascripts/streama/templates/admin-show.tpl.htm b/grails-app/assets/javascripts/streama/templates/admin-show.tpl.htm index 7d9bcf693..9e2e21419 100644 --- a/grails-app/assets/javascripts/streama/templates/admin-show.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/admin-show.tpl.htm @@ -84,7 +84,7 @@

- +
@@ -136,7 +136,11 @@

- +
diff --git a/grails-app/assets/javascripts/streama/templates/admin-shows.tpl.htm b/grails-app/assets/javascripts/streama/templates/admin-shows.tpl.htm index 77d4fcc6b..95c775a98 100644 --- a/grails-app/assets/javascripts/streama/templates/admin-shows.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/admin-shows.tpl.htm @@ -1,7 +1,7 @@

- Shows + Shows ({{tvShow.total}} items)

@@ -36,7 +36,7 @@

ng-repeat="show in tvShow.list" ui-sref="admin.show({showId: show.id})">
- + @@ -69,7 +69,7 @@

Want to add a new Show?

- +
Release: {{::show.release_date.substring(0, 4)}} | {{::show.vote_average}}
diff --git a/grails-app/assets/javascripts/streama/templates/admin-transcoding.tpl.htm b/grails-app/assets/javascripts/streama/templates/admin-transcoding.tpl.htm new file mode 100644 index 000000000..71c1f59a9 --- /dev/null +++ b/grails-app/assets/javascripts/streama/templates/admin-transcoding.tpl.htm @@ -0,0 +1,184 @@ +

Audio Transcoding

+ +
+ Loading... +
+ +
+ + +
+
+

FFmpeg Status

+
+
+
+ FFmpeg not detected. + Audio transcoding is not available. Please install FFmpeg on your server and configure the paths in Settings. +
+ +
+
+
+
+
FFmpeg Path
+
{{vm.status.ffmpegPath}}
+
FFprobe Path
+
{{vm.status.ffprobePath}}
+
Version
+
{{vm.status.ffmpegVersion || 'Unknown'}}
+
Transcoding Enabled
+
+ Yes + No +
+
+
+
+
+
Cache Directory
+
{{vm.cacheStats.cacheDirectory}}
+
Cached Files
+
{{vm.cacheStats.fileCount}}
+
Cache Size
+
{{vm.cacheStats.totalSizeMB}} MB
+
Pending Transcodes
+
{{vm.cacheStats.pendingCount}}
+
Active Jobs
+
{{vm.cacheStats.activeJobs}}
+
+
+
+
+
+
+ + +
+
+

Actions

+
+
+ + + +
+
+ + +
+
+

Pending Transcoding ({{vm.pendingFiles.length}})

+
+
+ + + + + + + + + + + + + + + + + +
FileAudio CodecStatusActions
{{file.originalFilename}}{{file.audioCodec}} + Pending + + Transcoding... + + + +
+
+
+ + +
+
+

All Video Files

+
+
+ + + + + + + + + + + + + + + + + + + + + +
FileAudio CodecNeeds TranscodingHas Cached AudioStatusActions
{{file.originalFilename}} + {{file.audioCodec}} + Not scanned + + Yes + No + Unknown + + Yes + No + + Ready + Pending + + {{file.progress ? (file.progress + '%') : 'Transcoding...'}} + + Failed + + + + +
+ +
    +
    +
    + + +
    + Transcoding is disabled. + Enable it in Settings > Enable Audio Transcoding. +
    + +
    diff --git a/grails-app/assets/javascripts/streama/templates/admin-video.tpl.htm b/grails-app/assets/javascripts/streama/templates/admin-video.tpl.htm index 245175693..f4aa36877 100644 --- a/grails-app/assets/javascripts/streama/templates/admin-video.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/admin-video.tpl.htm @@ -37,6 +37,7 @@

  • Edit info
  • Manage Files
  • Delete Video
  • +
  • Highlight on Dashboard
  • diff --git a/grails-app/assets/javascripts/streama/templates/admin-videos.tpl.htm b/grails-app/assets/javascripts/streama/templates/admin-videos.tpl.htm index 95b86660b..e63d85f00 100644 --- a/grails-app/assets/javascripts/streama/templates/admin-videos.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/admin-videos.tpl.htm @@ -1,7 +1,7 @@

    - Other Videos + Other Videos ({{videos.length}} items)

    diff --git a/grails-app/assets/javascripts/streama/templates/admin.tpl.htm b/grails-app/assets/javascripts/streama/templates/admin.tpl.htm index 6e37c68b1..77d309e7b 100644 --- a/grails-app/assets/javascripts/streama/templates/admin.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/admin.tpl.htm @@ -22,6 +22,12 @@
  • Reports
  • +
  • + Genres +
  • +
  • + Audio Transcoding +
  • diff --git a/grails-app/assets/javascripts/streama/templates/dash.tpl.htm b/grails-app/assets/javascripts/streama/templates/dash.tpl.htm index 2d7ab4856..49f3999c1 100644 --- a/grails-app/assets/javascripts/streama/templates/dash.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/dash.tpl.htm @@ -2,17 +2,15 @@
    -

    {{'DASHBOARD.NEW_RELEASES' | translate}}

    +

    {{'DASHBOARD.NEW_RELEASES' | translate}}

    - +
    -
    - -
    -
    + +
    @@ -39,13 +37,15 @@

    {{'DASHBOARD.LOOKING_AT_GE -
    +

    -

    {{'DASHBOARD.CONTINUE_WATCHING' | translate}}

    +

    {{'DASHBOARD.CONTINUE_WATCHING' | translate}} + ({{vm.continueWatching.list.length}} {{'DASHBOARD.TITLE_COUNTER_OF' | translate}} {{vm.continueWatching.total}}) +

    -
    +
    @@ -67,6 +67,9 @@

    {{'DASHBOARD.CONTINUE_WATCHING' | translate}}

    +
    + +
    @@ -116,6 +119,7 @@

    {{'DASHBOARD.WATCHLIST' | translate}}

    {{'DASHBOARD.DISCOVER_SHOWS' | translate}} {{::$root.selectedGenre.name}} TV Shows + ({{vm.tvShow.list.length}} {{'DASHBOARD.TITLE_COUNTER_OF' | translate}} {{vm.tvShow.total}})

    @@ -171,6 +175,7 @@

    {{'DASHBOARD.DISCOVER_MOVIES' | translate}} {{::selectedGenre.name}} Movies + ({{vm.movie.list.length}} {{'DASHBOARD.TITLE_COUNTER_OF' | translate}} {{vm.movie.total}})

    @@ -226,6 +231,7 @@

    {{'DASHBOARD.DISCOVER_OTHER_VIDEOS' | translate}} {{::$root.selectedGenre.name}} Videos + ({{vm.genericVideo.list.length}} {{'DASHBOARD.TITLE_COUNTER_OF' | translate}} {{vm.genericVideo.total}})

    diff --git a/grails-app/assets/javascripts/streama/templates/directive--streama-dash-media-item.tpl.htm b/grails-app/assets/javascripts/streama/templates/directive--streama-dash-media-item.tpl.htm index e90b1493f..edb1f1d4a 100644 --- a/grails-app/assets/javascripts/streama/templates/directive--streama-dash-media-item.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/directive--streama-dash-media-item.tpl.htm @@ -14,11 +14,15 @@

    +

    diff --git a/grails-app/assets/javascripts/streama/templates/directive--streama-video-image.tpl.htm b/grails-app/assets/javascripts/streama/templates/directive--streama-video-image.tpl.htm index f6b4d7972..8c8e52291 100644 --- a/grails-app/assets/javascripts/streama/templates/directive--streama-video-image.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/directive--streama-video-image.tpl.htm @@ -1,5 +1,3 @@ - - + + diff --git a/grails-app/assets/javascripts/streama/templates/modal--manage-files.tpl.htm b/grails-app/assets/javascripts/streama/templates/modal--manage-files.tpl.htm index ac2b6a75a..819bf311d 100644 --- a/grails-app/assets/javascripts/streama/templates/modal--manage-files.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/modal--manage-files.tpl.htm @@ -61,13 +61,11 @@ {{ file.name }} - {{ file.name }} - Choose @@ -81,6 +79,9 @@ +
    @@ -124,33 +125,41 @@

    Video Files


    -

    Subtitles

    +

    Subtitles + +

    - - - + + - + - - - - - + + + @@ -160,6 +169,8 @@

    Subtitles

    diff --git a/grails-app/assets/javascripts/streama/templates/modal--manage-opensubtitles.tpl.htm b/grails-app/assets/javascripts/streama/templates/modal--manage-opensubtitles.tpl.htm new file mode 100644 index 000000000..9e750abb3 --- /dev/null +++ b/grails-app/assets/javascripts/streama/templates/modal--manage-opensubtitles.tpl.htm @@ -0,0 +1,86 @@ +
    ID NameTypeLabel LanguageLabelActions
    {{file.id}}{{file.originalFilename}}{{file.contentType}} - - - - - - + {{file.originalFilename}} + {{file.subtitleSrcLang}} + + + {{file.subtitleLabel}} + + + + download + + + +
    + + + + + + + + + + + + + + + + + + +
    Full nameFormatLanguageDownloadsActions
    {{opensubtitle.subFileName}}{{opensubtitle.subFormat}}{{opensubtitle.languageName}}{{opensubtitle.subDownloadsCnt}} + +
    +
    + + diff --git a/grails-app/assets/javascripts/streama/templates/modal--media-detail.tpl.htm b/grails-app/assets/javascripts/streama/templates/modal--media-detail.tpl.htm index 0437f9b5a..527dde9ad 100644 --- a/grails-app/assets/javascripts/streama/templates/modal--media-detail.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/modal--media-detail.tpl.htm @@ -28,6 +28,9 @@
    +
    + +
    @@ -93,7 +96,7 @@

    {{'VIDEO.GENRE' | translate}}

    - +

    {{'VIDEO.TRAILER' | translate}}

    @@ -102,7 +105,7 @@

    {{'VIDEO.TRAILER' | translate}}

    - +
    @@ -130,6 +133,14 @@

    {{episode.name}}

    +
    + + Audio: {{file.label}} + + + Sub: {{sub.subtitleLabel || sub.subtitleSrcLang}}{{$last ? '' : ', '}} + +
    diff --git a/grails-app/assets/javascripts/streama/templates/modal--movie.tpl.htm b/grails-app/assets/javascripts/streama/templates/modal--movie.tpl.htm index 414b0adf1..43dc34994 100644 --- a/grails-app/assets/javascripts/streama/templates/modal--movie.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/modal--movie.tpl.htm @@ -87,7 +87,7 @@
    -
    +
    @@ -159,6 +159,26 @@
    + +
    +
    + +
    +
    +
    +
    + Upload Backdrop + 600x340 px + {{imageUpload.percentage}}% +
    +
    +
    + +
    +
    +
    +
    diff --git a/grails-app/assets/javascripts/streama/templates/modal--notification-add.tpl.htm b/grails-app/assets/javascripts/streama/templates/modal--notification-add.tpl.htm index 9592a0ae8..8b5ba211f 100644 --- a/grails-app/assets/javascripts/streama/templates/modal--notification-add.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/modal--notification-add.tpl.htm @@ -34,7 +34,7 @@

    {{selectedItem.name}}

    - +

    {{selectedItem.title}}

    diff --git a/grails-app/assets/javascripts/streama/templates/modal--tvShow.tpl.htm b/grails-app/assets/javascripts/streama/templates/modal--tvShow.tpl.htm index a704aab04..f3b59bd4a 100644 --- a/grails-app/assets/javascripts/streama/templates/modal--tvShow.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/modal--tvShow.tpl.htm @@ -78,7 +78,7 @@
    -
    +
    diff --git a/grails-app/assets/javascripts/streama/templates/settings-user-activity.tpl.htm b/grails-app/assets/javascripts/streama/templates/settings-user-activity.tpl.htm index 77cd24ccf..2ab38c18e 100644 --- a/grails-app/assets/javascripts/streama/templates/settings-user-activity.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/settings-user-activity.tpl.htm @@ -78,7 +78,7 @@

    Sort

    {{(activity.lastUpdated || activity.dateCreated) | date:'short'}}
    {{activity.video.title || activity.video.name}}
    s{{activity.video.season_number| padnumber:2}}e{{activity.video.episode_number | padnumber:2}}
    diff --git a/grails-app/assets/javascripts/streama/templates/streama-video-player.tpl.htm b/grails-app/assets/javascripts/streama/templates/streama-video-player.tpl.htm index 7fad56bb2..de58b70a8 100644 --- a/grails-app/assets/javascripts/streama/templates/streama-video-player.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/streama-video-player.tpl.htm @@ -17,12 +17,28 @@ -
    +
    +
    +
    +
    +
    +
    +
    +
    +

    {{'VIDEO.TRANSCODING_TITLE' | translate}}

    +

    {{'VIDEO.TRANSCODING_MESSAGE' | translate}}

    +
    +
    +
    + {{transcodingProgress}}% +
    +
    +

    You're watching

    @@ -132,6 +148,11 @@

  • +
    + + +
    +
    {{episode.episode_number | padnumber:2}} {{episode.name}} diff --git a/grails-app/assets/javascripts/streama/templates/sub-profiles.tpl.htm b/grails-app/assets/javascripts/streama/templates/sub-profiles.tpl.htm index 5d3f73f48..56d1afa7f 100644 --- a/grails-app/assets/javascripts/streama/templates/sub-profiles.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/sub-profiles.tpl.htm @@ -10,14 +10,14 @@

    {{subp.profileName}}

    -
    +

    +

    {{'ADD_SUB_PROFILE' | translate}}

    -
    +

    +

    @@ -44,14 +44,14 @@

    {{subp.profileName}}

    -
    +

    +

    {{'ADD_SUB_PROFILE' | translate}}

    -
    +

    +

    diff --git a/grails-app/assets/javascripts/streama/templates/user-settings.tpl.htm b/grails-app/assets/javascripts/streama/templates/user-settings.tpl.htm index 7284595de..d26b2d916 100644 --- a/grails-app/assets/javascripts/streama/templates/user-settings.tpl.htm +++ b/grails-app/assets/javascripts/streama/templates/user-settings.tpl.htm @@ -29,6 +29,15 @@

    +
    +
    + +
    +
    +

    {{lastLogin.dateCreated | date:'medium'}}

    +
    +
    +
    diff --git a/grails-app/assets/javascripts/streama/translations/CAT_cat.js b/grails-app/assets/javascripts/streama/translations/CAT_cat.js new file mode 100644 index 000000000..dd0cae5c3 --- /dev/null +++ b/grails-app/assets/javascripts/streama/translations/CAT_cat.js @@ -0,0 +1,179 @@ +//= wrapped +/** + * Created by antonia on 14/05/16. + * Improved translation by @agustinpallares94 on 23/11/21 + */ +angular.module('streama.translations').config(function ($translateProvider) { + $translateProvider.translations('cat', { + LOGIN: { + TITLE: 'Introduïu el vostre usuari', + USERNAME: 'Usuari', + PASSWORD: 'Contrasenya', + FIRST_TIME_HINT: 'És la teva primera vegada? Prova \'*admin\' en els dos camps.', + SUBMIT: 'Entrar', + SESSION_EXPIRED: 'La seva sessió va expirar des de la seva última activitat. Si us plau iniciï sessió de nou.', + FORGOT_PASSWORD: 'Has oblidat la contrasenya?' + }, + DASHBOARD: { + HOME: 'Casa', + TV_SHOWS: 'Programes', + MOVIES: 'Pel·lícules', + MY_LIST:'La meva llista', + TITLE: 'Panell de control', + TITLE_COUNTER_OF: 'of', + NEW_RELEASES: 'Noves Publicacions', + CONTINUE_WATCHING: 'Continuar Veient', + DISCOVER_SHOWS: 'Descobreix Sèries', + DISCOVER_MOVIES: 'Descobreix Sèries', + DISCOVER_OTHER_VIDEOS: 'Descobreix altres vídeos', + SORT: 'Ordenar:', + SEARCH_BY_NAME: 'Buscar per Nom...', + FILTER_BY_TAG: 'Filtrar per Etiqueta...', + BROWSE_GENRES: 'Buscar', + LOOKING_AT_GENRE: 'Estàs explorant el gènere:', + MARK_COMPLETED: 'Marcar com Completat', + NO_TVSHOWS_FOUND: 'No s han trobat Sèries', + NO_WATCHLIST_FOUND: 'Res aquí encara', + NO_MOVIES_FOUND: 'No s han trobat Pel·lícules', + WATCHLIST: 'veure més tard' + }, + VIDEO: { + RELEASED: 'Publicat', + IMDB: 'IMDB', + RATING: 'Puntuació', + STATUS: 'Estatus', + STATUS_VALUE: { + 'completed': 'Completat', + 'viewing': 'Visualització', + 'unviewed': 'No vist' + }, + VOTES: 'Vots', + OVERVIEW: 'Sinopsi', + GENRE: 'Gènere', + TRAILER: 'Trailer', + SEASON: 'Temporada', + NO_SUBTITLE: 'Sense subtítols' + }, + + MESSAGES: { + SHARE_SOCKET: 'Creant una sessió nova, seràs redirigit de tornada a aquest reproductor, però aquesta vegada tindràs un codi de sessió únic en la URL. Comparteix aquest enllaç per a tenir una experiència de visió sincronitzada!', + FILE_MISSING: 'Hi ha un problema amb aquest contingut. Sembla que l arxiu associat al mateix ha estat eliminat.', + CODEC_PROBLEM: 'Sembla que hi ha un problema afegint l arxiu de vídeo al reproductor. *Ésto sol deure s a un problema amb els còdecs. Prova convertint-ho a un còdec compatible amb HTML5, elimina el fitxer associat, i afegeix-lo de nou. Si els còdecs són els correctes, comprova el *log del servidor i la URL basi en les opcions.', + WRONG_BASEPATH: 'El teu vídeo ha estat inclòs usant una ruta incorrecta, però estàs accedint a la pàgina a *traves de la ruta "{{*basePath}}". Assegura t d escriure la ruta correcta en les propietats i que estàs usant-la per a accedir a l aplicació.' + }, + MANAGE_CONTENT: 'Gestionar Contingut', + MANAGE_SUB_PROFILES: 'Gestionar Perfils', + WHOS_WATCHING: 'Qui està veient?', + ADD_SUB_PROFILE: 'Afegir perfil', + EDIT_BTN: 'Editar', + DONE_BTN: 'Fet', + SAVE_BTN: 'Guardar', + CREATE_BTN: 'Crear', + CANCEL_BTN: 'Cancel·lar', + DELETE_BTN: 'Esborrar', + ENTER_NAME: 'Ingressi el seu nom', + EDIT_PROFILE: 'Editar perfil', + CREATE_PROFILE: 'Crear perfil', + ADMIN: 'Admin', + HELP: 'Ajuda', + HELP_FAQ: 'Ajuda / Preguntes Freqüents', + PROFILE_SETTINGS: 'Opcions de Perfil', + LOGOUT: 'Sortir', + CHANGE_PASSWORD: 'Canviar Contrasenya', + LANGUAGE_en: 'English/Anglès', + LANGUAGE_cn: 'Chinese/中文', + LANGUAGE_ru: 'Русский/Rus', + LANGUAGE_de: 'Deutsch/Alemany', + LANGUAGE_fr: 'Français/Francès', + LANGUAGE_es: 'Español/Castellà', + LANGUAGE_cat: 'Català', + LANGUAGE_kr: '한국어/Coreà', + LANGUAGE_nl: 'Nederlands/Holandès', + LANGUAGE_pt: 'Português/Portuguès', + LANGUAGE_ja: '日本語/Japonès', + LANGUAGE_it: 'Italiano/Italià', + LANGUAGE_da: 'Dansk/Danès', + LANGUAGE_ar: 'عربى/Àrab', + LANGUAGE_hu: 'Magyar/Hongarès', + PROFIlE: { + USERNAME: 'Nom d usuari', + FULL_NAME: 'Nom complet', + LANGUAGE: 'Idioma', + PAUSE_ON_CLICK: 'Clic en vídeo per a *pausar', + FAVORITE_GENRES: 'Gèneres Favorits', + SAVE: 'Guardar Perfil', + OLD_PASS: 'Antiga Contrasenya', + NEW_PASS: 'Nova Contrasenya', + NEW_PASS_PLACEHOLDER: 'Nova Contrasenya (min. 6 Caràcters)', + REPEAT_PASS: 'Repeteix la teva Contrasenya', + SAVE_PASS: 'Desar Nova Contrasenya', + AMOUNT_OF_MEDIA_ENTRIES: 'Quantitat de vídeos en la pàgina principal (abans que aparegui el botó "Carregar Més")' + }, + + SORT_OPTIONS: { + AZ: 'A-Z', + ZA: 'Z-A', + NEWEST_ADDED: 'Afegits Recentment', + OLDEST_ADDED: 'Afegits Primer', + NEWEST_RELEASED: 'Últims Publicats', + OLDEST_RELEASED: 'Primers Publicats', + NEWEST_AIRED: 'Transmesos Recentment', + OLDEST_AIRED: 'Transmesos Primer' + }, + + FAQ: { + UPLOAD_VIDEO: { + TITLE: 'Com puc pujar un vídeo?', + TEXT: "Pots pujar un vídeo accedint al menú Gestionar Contingut. Tria si vols pujar una Pel·lícula, una Sèrie o qualsevol altre vídeo. Fes clic en l'opció corresponent del menú" + + " vertical en el lateral esquerre de l'aplicació. Pots pujar un vídeo fent clic en el botó de Crear Nova Pel·lícula/Sèrie/Un altre o escrivint" + + " el nom del vídeo que vols pujar en la barra de cerca i seleccionant l'entrada desitjada d'entre els resultats. Després d'això, pots triar emplenar la informació del vídeo" + + " manualment. Posteriorment, pots pujar el vídeo i els arxius de subtítols prement sobre el botó Gestionar Arxius." + }, + DELETE_VIDEO: { + TITLE: 'Com puc esborrar un vídeo?', + TEXT: "Pots esborrar un vídeo anant a la pàgina d'informació d'aquest vídeo, fent clic a Gestionar Arxius i seleccionant la icona d'una paperera vermella. Una altra manera és fent clic a Editar Pel·lícula" + + " i seleccionant Esborrar pel·lícula. També pots usar el Gestor d'Arxius que es troba en el menú de Gestionar Contingut. D'aquesta manera pots veure tots els arxius pujats. Fes clic en Clic" + + " en la icona de la paperera vermella per a eliminar un fitxer." + }, + VIDEO_FORMATS: { + TITLE: 'Quins formats de vídeo estan suportats?', + TEXT: "*Streama suporta actualment només aquells formats de vídeo suportats pel reproductor HTML5. Pots comprovar si un arxiu de vídeo és compatible amb HTML5 arrossegant-ho" + + " a una pestanya buida del teu navegador." + }, + SUBTITLES: { + TITLE: 'Com puc afegir subtítols a un vídeo?', + TEXT: "Pots afegir subtítols als vídeos fent clic en el botó Gestionar Arxius que es troba en la pàgina d'informació del vídeo. Arrossega els arxius aquí." + + " Antigament havíem de convertir-los manualment a un format d'arxiu compatible, però ja no! Ara l'aplicació s'encarrega d'això per tu." + }, + INVITE_USERS: { + TITLE: 'Com puc convidar als meus amics a veure els meus vídeos?', + TEXT:"Pots compartir els teus vídeos amb els teus amics convidant-los a usar el teu *SalutFlix. Veu al menú d'Usuaris i fes clic en el botó de Convidar Usuari. Emplena el formulari d'invitació i" + + " selecciona el rol del convidat. Els usuaris amb el rol d'Administradors poden editar Usuaris i Configuracions. Els usuaris amb el rol de Gestor de Contingut poden editar el contingut. El teu amic serà notificat" + + " a través del seu correu electrònic. També pots compartir una sessió de vídeo amb els teus amics fent clic sobre el botó Compartir del reproductor i enviant-los l'enllaç corresponent." + }, + BASE_URL: { + TITLE: "Què és la URL basi i com hauria de configurar-la?", + TEXT: "La URL base s'utilitza en els vídeos i en els enllaços que s'envien en les invitacions per correu." + }, + NOTIFICATIONS: { + TITLE: "Què són les notificacions?", + TEXT: "Pots notificar als amics que convidis enviant-los missatges de notificació. Pots enviar-les afegint-les a la cua de notificacions fent clic en" + + " el botó d'Afegir Notificació que es troba en la pàgina d'informació del vídeo i accedint al menú de Notificacions i *clickando en el botó d'Enviar Cua." + }, + VIDEO_PLAYER_SHORTCUTS: { + TITLE: "El reproductor té tecles d'accés ràpid?", + TEXT: "Si. *Pausar/Continuar: espai. Controlar el *volúmen: fletxes de dalt i a baix. Avançar el vídeo avanci/enrere: fletxes de dreta i esquerra. Salt gran:" + + " control + fletxes de dreta i esquerra. Pantalla completa *on/*off: *alt + *enter. Subtítols *on/*off: S, Silenciar: M, Tornar a l'anterior" + + " pantalla: *delete o *backspace." + }, + FAVORITE_GENRES: { + TITLE: "Com afecten a *Streama els gèneres favorits de l'usuari?", + TEXT: "Pròximament..." + }, + USEFUL_LINKS: { + TITLE: "Enllaços útils", + TEXT: "Pròximament..." + } + } + }); +}); diff --git a/grails-app/assets/javascripts/streama/translations/CN_zh.js b/grails-app/assets/javascripts/streama/translations/CN_zh.js index 3d6b38f37..683f8d1d7 100644 --- a/grails-app/assets/javascripts/streama/translations/CN_zh.js +++ b/grails-app/assets/javascripts/streama/translations/CN_zh.js @@ -10,7 +10,8 @@ angular.module('streama.translations').config(function ($translateProvider) { PASSWORD: '密码', FIRST_TIME_HINT: '第一次使用? 试试用 \'admin\' 作为用户名和密码登录。', SUBMIT: '登录', - SESSION_EXPIRED: '你的会话已过期,请重新登录' + SESSION_EXPIRED: '你的会话已过期,请重新登录', + FORGOT_PASSWORD: '忘记密码?' }, DASHBOARD: { HOME: '主页', @@ -18,6 +19,7 @@ angular.module('streama.translations').config(function ($translateProvider) { MOVIES: '电影', MY_LIST:'我的片单', TITLE: '回到主页', + TITLE_COUNTER_OF: 'of', RECOMMENDATIONS: '为你推荐', NEW_RELEASES: '最新发售', CONTINUE_WATCHING: '继续观看', @@ -98,6 +100,7 @@ angular.module('streama.translations').config(function ($translateProvider) { LANGUAGE_da: 'Dansk/Danish', LANGUAGE_ar: 'عربى/Arabic', LANGUAGE_hu: 'Magyar/Hungarian', + LANGUAGE_sk: 'Slovensky/Slovak', PROFIlE: { USERNAME: '用户名', FULL_NAME: '完整名字', diff --git a/grails-app/assets/javascripts/streama/translations/DE_de.js b/grails-app/assets/javascripts/streama/translations/DE_de.js index ce36a6470..a9d287c20 100644 --- a/grails-app/assets/javascripts/streama/translations/DE_de.js +++ b/grails-app/assets/javascripts/streama/translations/DE_de.js @@ -11,7 +11,8 @@ angular.module('streama.translations').config(function ($translateProvider) { PASSWORD: 'Passwort', FIRST_TIME_HINT: 'Erstes mal hier? Versuche \'admin\' als Benutzername und Passwort.', SUBMIT: 'Login', - SESSION_EXPIRED: 'Deine Sitzung ist abgelaufen. Bitte logge dich erneut ein.' + SESSION_EXPIRED: 'Deine Sitzung ist abgelaufen. Bitte logge dich erneut ein.', + FORGOT_PASSWORD: 'Passwort vergessen?' }, DASHBOARD: { HOME: 'Startseite', @@ -19,6 +20,7 @@ angular.module('streama.translations').config(function ($translateProvider) { MOVIES: 'Filme', MY_LIST:'Meine Liste', TITLE: 'Dashboard', + TITLE_COUNTER_OF: 'von', NEW_RELEASES: 'Neuerscheinungen', CONTINUE_WATCHING: 'Weiterschauen', DISCOVER_SHOWS: 'Entdecke Serien', @@ -42,9 +44,9 @@ angular.module('streama.translations').config(function ($translateProvider) { RATING: 'Bewertungen', STATUS: 'Status', STATUS_VALUE: { - 'completed': 'Completed', - 'viewing': 'Viewing', - 'unviewed': 'Unviewed' + 'completed': 'Angeschaut', + 'viewing': 'Weiterschauen', + 'unviewed': 'Ungesehen' }, VOTES: 'Stimmen', OVERVIEW: 'Zusammenfassung', @@ -93,6 +95,7 @@ angular.module('streama.translations').config(function ($translateProvider) { LANGUAGE_da: 'Dansk/Dänisch', LANGUAGE_ar: 'عربى/Arabisch', LANGUAGE_hu: 'Magyar/Ungarisch', + LANGUAGE_sk: 'Slovensky/Slovak', PROFIlE: { USERNAME: 'Benutzername', FULL_NAME: 'Echter Name', diff --git a/grails-app/assets/javascripts/streama/translations/DK_da.js b/grails-app/assets/javascripts/streama/translations/DK_da.js index 45e42bbc6..c0a6f15ec 100644 --- a/grails-app/assets/javascripts/streama/translations/DK_da.js +++ b/grails-app/assets/javascripts/streama/translations/DK_da.js @@ -10,7 +10,8 @@ angular.module('streama.translations').config(function ($translateProvider) { PASSWORD: 'Kodeord', FIRST_TIME_HINT: 'Første gang du logger ind? Prøv \'admin\' i begge felter.', SUBMIT: 'Log Ind', - SESSION_EXPIRED: 'Din session er udløbet siden din sidste aktivitet. Venligst log ind igen.' + SESSION_EXPIRED: 'Din session er udløbet siden din sidste aktivitet. Venligst log ind igen.', + FORGOT_PASSWORD: 'Glemt adgangskode?' }, DASHBOARD: { HOME: 'Hjemmeside', @@ -18,6 +19,7 @@ angular.module('streama.translations').config(function ($translateProvider) { MOVIES: 'Films', MY_LIST:'Min liste', TITLE: 'Betjeningspanel', + TITLE_COUNTER_OF: 'of', RECOMMENDATIONS: 'Foreslået til dig', NEW_RELEASES: 'Nye Udgivelser', CONTINUE_WATCHING: 'Se videre', @@ -93,6 +95,7 @@ angular.module('streama.translations').config(function ($translateProvider) { LANGUAGE_da: 'Dansk', LANGUAGE_ar: 'عربى/Arabisk', LANGUAGE_hu: 'Magyar/Ungarsk', + LANGUAGE_sk: 'Slovensky/Slovak', PROFIlE: { USERNAME: 'Brugernavn', FULL_NAME: 'Fulde Navn', diff --git a/grails-app/assets/javascripts/streama/translations/EN_us.js b/grails-app/assets/javascripts/streama/translations/EN_us.js index 07a3dd77e..d0b0b9313 100644 --- a/grails-app/assets/javascripts/streama/translations/EN_us.js +++ b/grails-app/assets/javascripts/streama/translations/EN_us.js @@ -10,7 +10,8 @@ angular.module('streama.translations').config(function ($translateProvider) { PASSWORD: 'Password', FIRST_TIME_HINT: 'First time logging in? Try \'admin\' for both fields.', SUBMIT: 'Login', - SESSION_EXPIRED: 'Your session expired since your last activity. Please login again.' + SESSION_EXPIRED: 'Your session expired since your last activity. Please login again.', + FORGOT_PASSWORD: 'Forgot Password?' }, DASHBOARD: { HOME: 'Home', @@ -18,6 +19,7 @@ angular.module('streama.translations').config(function ($translateProvider) { MOVIES: 'Movies', MY_LIST:'My list', TITLE: 'Dashboard', + TITLE_COUNTER_OF: 'of', RECOMMENDATIONS: 'Recommendations for you', NEW_RELEASES: 'New Releases', CONTINUE_WATCHING: 'Continue Watching', @@ -55,7 +57,9 @@ angular.module('streama.translations').config(function ($translateProvider) { NO_SUBTITLE: 'No Subtitle', SUBTITLE_SIZE: 'Subtitle Sizes', VIDEO_FILES: 'Video Sources', - UPNEXT: 'Up Next...' + UPNEXT: 'Up Next...', + TRANSCODING_TITLE: 'Converting Audio', + TRANSCODING_MESSAGE: 'The audio in this video needs to be converted for your browser. This only happens once per video.' }, MESSAGES: { @@ -63,7 +67,8 @@ angular.module('streama.translations').config(function ($translateProvider) { FILE_MISSING: 'There is a problem with this content. It seems you removed the associated video file from it.', CODEC_PROBLEM: 'There seems to be a problem adding the video-file to the player. This is most likely due to a codec-problem. Try converting it to a compatible HTML5 codec, remove the currently attached file and re-add it. If the codecs are fine, check the error log of the server and the base URL in the settings.', WRONG_BASEPATH: 'Your video get\'s included using the wrong Base Path, but you are browsing the page via "{{basePath}}". Make sure you set the correct Base Path in the settings and that you are using it to browse the application.', - FILE_IN_FS_NOT_FOUND: 'Your video cannot be found in any of the locations available to the application. Please check your settings and your file system to make sure that the files are accessible by the application.' + FILE_IN_FS_NOT_FOUND: 'Your video cannot be found in any of the locations available to the application. Please check your settings and your file system to make sure that the files are accessible by the application.', + TRANSCODING_FAILED: 'Audio transcoding failed for this video. Please check the server logs for more details, or try re-uploading the video file.' }, MANAGE_CONTENT: 'Manage Content', MANAGE_SUB_PROFILES: 'Manage profiles', @@ -90,6 +95,7 @@ angular.module('streama.translations').config(function ($translateProvider) { LANGUAGE_de: 'Deutsch/German', LANGUAGE_fr: 'Français/French', LANGUAGE_es: 'Español/Spanish', + LANGUAGE_cat: 'Català/Catalan', LANGUAGE_kr: '한국어/Korean', LANGUAGE_nl: 'Nederlands/Dutch', LANGUAGE_pt: 'Português/Portuguese', @@ -98,9 +104,11 @@ angular.module('streama.translations').config(function ($translateProvider) { LANGUAGE_da: 'Dansk/Danish', LANGUAGE_ar: 'عربى/Arabic', LANGUAGE_hu: 'Magyar/Hungarian', + LANGUAGE_sk: 'Slovensky/Slovak', PROFIlE: { USERNAME: 'Username', FULL_NAME: 'Full Name', + LAST_LOGIN: 'Last Login', LANGUAGE: 'Language', PAUSE_ON_CLICK: 'Pause Video on Click', FAVORITE_GENRES: 'Favorite Genres', diff --git a/grails-app/assets/javascripts/streama/translations/ES_es.js b/grails-app/assets/javascripts/streama/translations/ES_es.js index 133dedc0b..124da8596 100644 --- a/grails-app/assets/javascripts/streama/translations/ES_es.js +++ b/grails-app/assets/javascripts/streama/translations/ES_es.js @@ -11,7 +11,8 @@ angular.module('streama.translations').config(function ($translateProvider) { PASSWORD: 'Contraseña', FIRST_TIME_HINT: '¿Es tu primera vez? Prueba \'admin\' en ambos campos.', SUBMIT: 'Entrar', - SESSION_EXPIRED: 'Su sesión expiró desde su última actividad. Por favor inicie sesión de nuevo.' + SESSION_EXPIRED: 'Su sesión expiró desde su última actividad. Por favor inicie sesión de nuevo.', + FORGOT_PASSWORD: '¿Olvidaste tu contraseña?' }, DASHBOARD: { HOME: 'Casa', @@ -19,6 +20,7 @@ angular.module('streama.translations').config(function ($translateProvider) { MOVIES: 'Películas', MY_LIST:'Mi lista', TITLE: 'Panel de control', + TITLE_COUNTER_OF: 'of', NEW_RELEASES: 'Nuevas Publicaciones', CONTINUE_WATCHING: 'Continuar Viendo', DISCOVER_SHOWS: 'Descubre Series', @@ -92,6 +94,7 @@ angular.module('streama.translations').config(function ($translateProvider) { LANGUAGE_da: 'Dansk/Danés', LANGUAGE_ar: 'عربى/Árabe', LANGUAGE_hu: 'Magyar/Húngaro', + LANGUAGE_sk: 'Slovensky/Slovak', PROFIlE: { USERNAME: 'Nombre de usuario', FULL_NAME: 'Nombre completo', diff --git a/grails-app/assets/javascripts/streama/translations/FR_fr.js b/grails-app/assets/javascripts/streama/translations/FR_fr.js index b20f81d2c..676b96b9e 100644 --- a/grails-app/assets/javascripts/streama/translations/FR_fr.js +++ b/grails-app/assets/javascripts/streama/translations/FR_fr.js @@ -7,7 +7,8 @@ angular.module('streama.translations').config(function ($translateProvider) { PASSWORD: 'Mot de passe', FIRST_TIME_HINT: 'Première connexion ? Connectez-vous avec \'admin\'/\'admin\'.', SUBMIT: 'Connexion', - SESSION_EXPIRED: 'Votre session a expiré depuis votre dernière activité. Veuillez vous reconnecter.' + SESSION_EXPIRED: 'Votre session a expiré depuis votre dernière activité. Veuillez vous reconnecter.', + FORGOT_PASSWORD: 'Mot de passe oublié ?' }, DASHBOARD: { HOME: 'Accueil', @@ -15,6 +16,7 @@ angular.module('streama.translations').config(function ($translateProvider) { MOVIES: 'Films', MY_LIST:'Ma liste', TITLE: 'Tableau de bord', + TITLE_COUNTER_OF: 'of', NEW_RELEASES: 'Nouvelles sorties', CONTINUE_WATCHING: 'Continuer le visionnage', DISCOVER_SHOWS: 'Découvrez des séries', @@ -88,6 +90,7 @@ angular.module('streama.translations').config(function ($translateProvider) { LANGUAGE_da: 'Dansk/Danois', LANGUAGE_ar: 'عربى/Arabe', LANGUAGE_hu: 'Magyar/Hongrois', + LANGUAGE_sk: 'Slovensky/Slovak', PROFIlE: { USERNAME: 'Nom d\'utilisateur', FULL_NAME: 'Nom complet', diff --git a/grails-app/assets/javascripts/streama/translations/HR.js b/grails-app/assets/javascripts/streama/translations/HR.js new file mode 100644 index 000000000..0103cf4c3 --- /dev/null +++ b/grails-app/assets/javascripts/streama/translations/HR.js @@ -0,0 +1,166 @@ +//= wrapped +angular.module('streama.translations').config(function ($translateProvider) { + $translateProvider.translations('hr', { + LOGIN: { + TITLE: "Molimo prijavite se", + USERNAME: "Korisničko Ime", + PASSWORD: "Lozinka", + FIRST_TIME_HINT: "Prva prijava? Pokušajte 'admin' za oba polja.", + SUBMIT: "Prijavi se", + SESSION_EXPIRED: "Vaša je sesija istekla od vaše posljednje aktivnosti. Molimo prijavite se ponovo.", + FORGOT_PASSWORD: "Zaboravili ste lozinku?" + }, + DASHBOARD: { + HOME: "Početna", + TV_SHOWS: "TV Serije", + MOVIES: "Filmovi", + MY_LIST: "Moj popis", + TITLE: "Nadzorna ploča", + TITLE_COUNTER_OF: 'of', + RECOMMENDATIONS: "Preporuke za vas", + NEW_RELEASES: "Nova izdanja", + CONTINUE_WATCHING: "Nastavite gledati", + DISCOVER_SHOWS: "Otkrijte serije", + DISCOVER_MOVIES: "Otkrijte Filmove", + DISCOVER_OTHER_VIDEOS: "Otkrijte ostale videe", + SORT: "Sortiraj:", + SEARCH_BY_NAME: "Pretraži po naslovu...", + FILTER_BY_TAG: "Filtriraj po oznaci...", + FILTER_BY_GENRE: "Filtriraj po žanru...", + BROWSE_GENRES: "Pretraži žanrove", + LOOKING_AT_GENRE: "Gledate žanr:", + MARK_COMPLETED: "Označi pogledanim", + NO_TVSHOWS_FOUND: "Nema dostupnih TV serija", + NO_WATCHLIST_FOUND: "Ovdje nema ničega.", + NO_MOVIES_FOUND: "Nema dostupnih filmova", + WATCHLIST: "Popis gledanja" + }, + VIDEO: { + RELEASED: "Izdano", + IMDB: "IMDB", + RATING: "Rating", + STATUS: "Status", + STATUS_VALUE: {completed: "Pogledano", viewing: "Gleda se", unviewed: "Nepregledano"}, + VOTES: "Glasovi", + OVERVIEW: "Pregled", + GENRE: "Žanr", + TRAILER: "Trailer", + SEASON: "Sezona", + SUBTITLES: "Podnaslovi", + NO_SUBTITLE: "Nema podnaslova", + SUBTITLE_SIZE: "Veličina podnaslova", + VIDEO_FILES: "Video izvori", + UPNEXT: "Slijedi..." + }, + MESSAGES: { + SHARE_SOCKET: "Stvaranjem nove sesije bit ćete preusmjereni natrag na ovu stranicu, ali ovaj put ćete na url-u imati jedinstveni ID sesije. Podijelite ovo sa svojim prijateljima kako biste s njima imali sinkronizirano iskustvo gledanja!", + FILE_MISSING: "Postoji problem s ovim sadržajem. Čini se da ste uklonili povezanu video datoteku.", + CODEC_PROBLEM: "Čini se da postoji problem s dodavanjem video datoteke u uređaj za reprodukciju. To je najvjerojatnije zbog problema s kodekom. Pokušajte ga pretvoriti u kompatibilni HTML5 kodek, uklonite trenutno priloženu datoteku i ponovo je dodajte. Ako su kodeci u redu, provjerite zapis pogrešaka poslužitelja i osnovni URL u postavkama.", + WRONG_BASEPATH: 'Vaš videozapis uključen je pogrešnim osnovnim putem, ali stranicu pregledavate putem "{{basePath}}". Obavezno postavite točan osnovni put u postavkama i koristite li ga za pregledavanje programa.', + FILE_IN_FS_NOT_FOUND: "Vaš videozapis nije moguće pronaći ni na jednom mjestu dostupnom aplikaciji. Provjerite postavke i datotečni sustav kako biste bili sigurni da je datotekama program dostupan." + }, + MANAGE_CONTENT: "Upravljanje sadržajem", + MANAGE_SUB_PROFILES: "Upravljanje profilima", + WHOS_WATCHING: "Tko gleda?", + ADD_SUB_PROFILE: "Dodaj profil", + EDIT_BTN: "Uredi", + DONE_BTN: "Gotovo", + SAVE_BTN: "Spremi", + CREATE_BTN: "Kreiraj", + CANCEL_BTN: "Otkaži", + DELETE_BTN: "Obriši", + ENTER_NAME: "Upiši ime", + EDIT_PROFILE: "Uredi profil", + CREATE_PROFILE: "Kreiraj profil", + ADMIN: "Admin", + HELP: "Pomoć", + HELP_FAQ: "POMOĆ / FAQ", + PROFILE_SETTINGS: "Korisničke postavke", + LOGOUT: "Odjavi se", + CHANGE_PASSWORD: "Promijeni lozinku", + LANGUAGE_en: "Engleski", + LANGUAGE_cn: "Kineski/\u4e2d\u6587", + LANGUAGE_ru: "\u0420\u0443\u0441\u0441\u043a\u0438\u0439/Ruski", + LANGUAGE_de: "Njemački", + LANGUAGE_fr: "Francuski", + LANGUAGE_es: "Španjolski", + LANGUAGE_kr: "Koreski", + LANGUAGE_nl: "Nizozemski", + LANGUAGE_pt: "Portugalski", + LANGUAGE_ja: "Japanski", + LANGUAGE_it: "Talijanski", + LANGUAGE_da: "Danski", + LANGUAGE_ar: "Arapski", + LANGUAGE_hu: "Mađarski", + LANGUAGE_sk: "Slovensky/Slovak", + PROFIlE: { + USERNAME: "Korisničko ime", + FULL_NAME: "Puno ime", + LANGUAGE: "Jezik", + PAUSE_ON_CLICK: "Pauziraj video na klik", + FAVORITE_GENRES: "Omiljeni žanrovi", + AMOUNT_OF_MEDIA_ENTRIES: 'Količina videozapisa na nadzornoj ploči (prije "Učitaj više")', + SAVE: "Spremi profil", + PASS: "Lozinka", + OLD_PASS: "Stara lozinka", + NEW_PASS: "Nova lozinka", + NEW_PASS_PLACEHOLDER: "Nova lozinka (min. 6 znakova)", + REPEAT_PASS: "Ponovi lozinku", + PASS_ERROR_EMPTY: "Lozinka ne može biti ništa", + PASS_ERROR_LENGTH: "Lozinka mora sadržavati barem 6 znakova", + PASS_ERROR_REPEAT: "Lozinke se moraju podudarati", + SAVE_PASS: "Postavi novu lozinku" + }, + SORT_OPTIONS: { + AZ: "A-Z", + ZA: "Z-A", + NEWEST_ADDED: "Zadnje dodano", + OLDEST_ADDED: "Prvo dodano", + NEWEST_RELEASED: "Najnovije izdanje", + OLDEST_RELEASED: "Najstarije izdanje", + NEWEST_AIRED: "Najnovije emitirano", + OLDEST_AIRED: "Najstarije emitirano", + NEWEST_REPORTED: "Najnovije prijavljeno", + OLDEST_REPORTED: "Najstarije prijavljeno", + NEWEST_UPDATED: "Najnovije ažurirano", + OLDEST_UPDATED: "Najstarije ažurirano" + }, + FAQ: { + UPLOAD_VIDEO: { + TITLE: "Kako mogu prenijeti videozapis?", + TEXT: "Videozapise možete prenijeti na izbornik Upravljanje sadržajem. Odaberite želite li prenijeti film, TV emisiju ili drugi video. Kliknite odgovarajuću opciju podizbornika na vertikalnoj navigacijskoj traci s lijeve strane zaslona. Videozapis možete prenijeti klikom na gumb Stvori novi film / TV emisiju / Drugi videozapis ili upisivanjem naziva videozapisa koji želite prenijeti na traku za pretraživanje i odabirom odgovarajućeg filma iz rezultata pretraživanja. Nakon toga, podatke o videozapisu možete popuniti ručno ili učitavanje podataka iz TheMovieDB. Nakon toga, datoteke videozapisa i titlova možete prenijeti klikom na gumb Upravljanje datotekama." + }, + DELETE_VIDEO: { + TITLE: "Kako mogu izbrisati videozapis?", + TEXT: "Video možete izbrisati tako da odete na stranicu s informacijama o videozapisu i kliknete Manage Files i odaberete ikonu crvenog koša za smeće. Klik na Edit Movie i odabir Delete Movie još je jedan način za to. Također možete koristiti Upravitelj datoteka koji se nalazi u izborniku Upravljanje sadržajem. Tamo možete vidjeti sve datoteke koje ste prenijeli. Kliknite ikonu crvene kante za smeće da biste izbrisali datoteku." + }, + VIDEO_FORMATS: { + TITLE: "Koji su video formati podržani?", + TEXT: "Croflix trenutno podržava samo formate video datoteka koje podržava HTML5 player. Možete testirati je li vaša video datoteka kompatibilna s HTML5 playerom povlačenjem i ispuštanjem datoteke na praznu karticu preglednika." + }, + SUBTITLES: { + TITLE: "Kako mogu dodati titlove videozapisima?", + TEXT: "Videozapisima možete dodati titlove klikom na gumb Upravljanje datotekama koji se nalazi na stranici s informacijama o videozapisu. Tamo možete povući i ispustiti datoteke titlova. Prije ste ih morali ručno pretvoriti u kompatibilni format datoteke, ali više ne! Sada aplikacija to rješava umjesto vas." + }, + INVITE_USERS: { + TITLE: "Kako mogu pozvati prijatelje da gledaju videozapise skupa samnom?", + TEXT: "Svoje videozapise možete podijeliti s prijateljima pozivom da koriste Croflix. Idite na izbornik Korisnici i kliknite gumb Pozovi korisnika. Ispunite obrazac za pozivnicu i odaberite uloge pozvanog. Korisnici s ulogom Administrator mogu uređivati korisnike i postavke. Korisnici s ulogom Content Manager mogu uređivati sadržaj. O pozivu će vaš prijatelj biti obaviješten e-poštom. Također možete podijeliti video sesije sa svojim prijateljima tako što ćete kliknuti gumb Podijeli videoplayer i povezati URL sesije s njima." + }, + BASE_URL: { + TITLE: "Koji je osnovni URL i kako ga treba konfigurirati?", + TEXT: "Osnovni URL koristi se za videozapise i vezu u e-poruci s pozivnicom." + }, + NOTIFICATIONS: { + TITLE: "Što su obavijesti?", + TEXT: "Pozvane prijatelje možete obavijestiti o prenesenim videozapisima slanjem poruka obavijesti. Možete ih poslati tako da im dodate svoj red obavijesti klikom na gumb Dodaj obavijest koji se nalazi na stranici s informacijama o vašem videozapisu i odlaskom na izbornik Obavijesti i klikom na gumb Pošalji red čekanja." + }, + VIDEO_PLAYER_SHORTCUTS: { + TITLE: "Ima li video uređaj tipke prečaca?", + TEXT: "Da. Pauza / pauza: razmak. Upravljanje glasnoćom: tipke sa strelicama gore ili dolje. Preskakanje videozapisa naprijed / natrag: tipke sa strelicama lijevo ili desno. Dugo preskakanje: kontrola + tipke sa strelicama lijevo ili desno. Uključivanje / isključivanje preko cijelog zaslona: alt + enter. Uključivanje / isključivanje titlova: S, Prigušivanje zvuka: M, Povratak na prethodni zaslon: brisanje ili vraćanje unazad." + }, + FAVORITE_GENRES: {TITLE: "Kako korisnici dodaju omiljeni žanr?", TEXT: "Dolazi uskoro..."}, + USEFUL_LINKS: {TITLE: "Korisne poveznice", TEXT: "Dolazi uskoro..."} + } + } + ); +}); diff --git a/grails-app/assets/javascripts/streama/translations/HU_hu.js b/grails-app/assets/javascripts/streama/translations/HU_hu.js index e5e5fb490..9a20c0621 100644 --- a/grails-app/assets/javascripts/streama/translations/HU_hu.js +++ b/grails-app/assets/javascripts/streama/translations/HU_hu.js @@ -11,10 +11,12 @@ angular.module('streama.translations').config(function ($translateProvider) { PASSWORD: 'Jelszó', FIRST_TIME_HINT: 'Első bejelentkezés? Próbálja meg az \'admin\'-t mindkét mezőbe.', SUBMIT: 'Bejelentkezés', - SESSION_EXPIRED: 'Az ülése lejárt a legutóbbi aktivitás óta. Jelentkezzen be újra.' + SESSION_EXPIRED: 'Az ülése lejárt a legutóbbi aktivitás óta. Jelentkezzen be újra.', + FORGOT_PASSWORD: 'Elfelejtette jelszavát?' }, DASHBOARD: { TITLE: 'Főoldal', + TITLE_COUNTER_OF: 'of', RECOMMENDATIONS: 'Ajánlatok', NEW_RELEASES: 'Nemrég megjelent', CONTINUE_WATCHING: 'Megtekintés folytatása', @@ -94,6 +96,7 @@ angular.module('streama.translations').config(function ($translateProvider) { LANGUAGE_da: 'Dán/Danish', LANGUAGE_ar: 'Arab/Arabic', LANGUAGE_hu: 'Magyar', + LANGUAGE_sk: 'Slovensky/Slovak', PROFIlE: { USERNAME: 'Felhasználónév', FULL_NAME: 'Teljes név', diff --git a/grails-app/assets/javascripts/streama/translations/IQ_ar.js b/grails-app/assets/javascripts/streama/translations/IQ_ar.js index f9d2c9614..8f753a231 100644 --- a/grails-app/assets/javascripts/streama/translations/IQ_ar.js +++ b/grails-app/assets/javascripts/streama/translations/IQ_ar.js @@ -10,7 +10,8 @@ angular.module('streama.translations').config(function ($translateProvider) { PASSWORD: 'الرمز', FIRST_TIME_HINT: 'اول مرة تقوم بتسجيل الدخول؟ حاول ادخال \'admin\' بالفراغيين.', SUBMIT: 'تسجيل الدخول', - SESSION_EXPIRED: 'انتهت صلاحية الدخول منذ اخر نشاط. الرجاء تسجيل الدخول مرة اخرى.' + SESSION_EXPIRED: 'انتهت صلاحية الدخول منذ اخر نشاط. الرجاء تسجيل الدخول مرة اخرى.', + FORGOT_PASSWORD: 'هل نسيت كلمة المرور؟' }, DASHBOARD: { HOME: 'الصفحة الرئيسية', @@ -18,6 +19,7 @@ angular.module('streama.translations').config(function ($translateProvider) { MOVIES: 'أفلام', MY_LIST:'قائمتي', TITLE: 'الواجهة الرئيسية', + TITLE_COUNTER_OF: 'of', RECOMMENDATIONS: 'افضل الافلام', NEW_RELEASES: 'المصدرة حديثا', CONTINUE_WATCHING: 'الاستمرار في المشاهدة', @@ -93,6 +95,7 @@ angular.module('streama.translations').config(function ($translateProvider) { LANGUAGE_da: 'Dansk/دانماركي', LANGUAGE_ar: 'عربى', LANGUAGE_hu: 'Magyar/الهنغارية', + LANGUAGE_sk: 'Slovensky/Slovak', PROFIlE: { USERNAME: 'الاسم', FULL_NAME: 'الاسم الكامل', diff --git a/grails-app/assets/javascripts/streama/translations/IT_it.js b/grails-app/assets/javascripts/streama/translations/IT_it.js index 2770a2e6d..e171b5a84 100644 --- a/grails-app/assets/javascripts/streama/translations/IT_it.js +++ b/grails-app/assets/javascripts/streama/translations/IT_it.js @@ -11,7 +11,8 @@ angular.module('streama.translations').config(function ($translateProvider) { PASSWORD: 'Password', FIRST_TIME_HINT: 'Prima volta log-in? Provare \'admin\' per entrambi i campi.', SUBMIT: 'Account di accesso', - SESSION_EXPIRED: 'La sessione è scaduta dall\'ultima attività. Per favore esegui l\'accesso di nuovo.' + SESSION_EXPIRED: 'La sessione è scaduta dall\'ultima attività. Per favore esegui l\'accesso di nuovo.', + FORGOT_PASSWORD: 'Password dimenticata?' }, DASHBOARD: { HOME: 'Casa', @@ -19,6 +20,7 @@ angular.module('streama.translations').config(function ($translateProvider) { MOVIES: 'Films', MY_LIST:'La mia lista', TITLE: 'Cruscotto', + TITLE_COUNTER_OF: 'of', NEW_RELEASES: 'Nuove uscite', CONTINUE_WATCHING: 'Continuare a guardare', DISCOVER_SHOWS: 'Scopri spettacoli', @@ -92,6 +94,7 @@ angular.module('streama.translations').config(function ($translateProvider) { LANGUAGE_da: 'Dansk/danese', LANGUAGE_ar: 'عربى/Arabo', LANGUAGE_hu: 'Magyar/Ungherese', + LANGUAGE_sk: 'Slovensky/Slovak', PROFIlE: { USERNAME: 'Nome Utente', FULL_NAME: 'Nome e cognome', diff --git a/grails-app/assets/javascripts/streama/translations/JA_ja.js b/grails-app/assets/javascripts/streama/translations/JA_ja.js index 3322a36cf..5456936e0 100644 --- a/grails-app/assets/javascripts/streama/translations/JA_ja.js +++ b/grails-app/assets/javascripts/streama/translations/JA_ja.js @@ -10,7 +10,8 @@ angular.module('streama.translations').config(function ($translateProvider) { PASSWORD: 'パスワード', FIRST_TIME_HINT: '最初のログイン ? ログイン \'admin\' ユーザー名とパスワード。', SUBMIT: 'ログイン', - SESSION_EXPIRED: 'あなたの最後の活動以来あなたのセッションは期限切れです。もう一度ログインしてください。' + SESSION_EXPIRED: 'あなたの最後の活動以来あなたのセッションは期限切れです。もう一度ログインしてください。', + FORGOT_PASSWORD: 'パスワードをお忘れですか?' }, DASHBOARD: { HOME: 'ホーム', @@ -18,6 +19,7 @@ angular.module('streama.translations').config(function ($translateProvider) { MOVIES: '映画', MY_LIST:'私のリスト', TITLE: 'ダッシュ ボード', + TITLE_COUNTER_OF: 'of', NEW_RELEASES: '新しいリリース', CONTINUE_WATCHING: '続きを見る', DISCOVER_SHOWS: 'ショーを発見します', @@ -91,6 +93,7 @@ angular.module('streama.translations').config(function ($translateProvider) { LANGUAGE_da: 'Dansk/デンマーク語', LANGUAGE_ar: 'عربى/アラビア語', LANGUAGE_hu: 'Magyar/ハンガリー人', + LANGUAGE_sk: 'Slovensky/Slovak', PROFIlE: { USERNAME: 'ユーザー名', FULL_NAME: '完全な名前', diff --git a/grails-app/assets/javascripts/streama/translations/KR_ko.js b/grails-app/assets/javascripts/streama/translations/KR_ko.js index d9ea361f4..d7e440bd3 100644 --- a/grails-app/assets/javascripts/streama/translations/KR_ko.js +++ b/grails-app/assets/javascripts/streama/translations/KR_ko.js @@ -10,7 +10,8 @@ angular.module('streama.translations').config(function ($translateProvider) { PASSWORD: '비밀번호', FIRST_TIME_HINT: '처음 로그인 하시나요? \'admin\'를 입력해보세요!', SUBMIT: '로그인', - SESSION_EXPIRED: '마지막 활동 이후 세션이 만료되었습니다. 다시 로그인하십시오.' + SESSION_EXPIRED: '마지막 활동 이후 세션이 만료되었습니다. 다시 로그인하십시오.', + FORGOT_PASSWORD: '비밀번호를 잊으셨나요?' }, DASHBOARD: { HOME: '집', @@ -18,6 +19,7 @@ angular.module('streama.translations').config(function ($translateProvider) { MOVIES: '영화 산업', MY_LIST:'나의 목록', TITLE: '대시보드', + TITLE_COUNTER_OF: 'of', NEW_RELEASES: '신작', CONTINUE_WATCHING: '계속해서 보기', DISCOVER_SHOWS: '드라마 찾기', @@ -91,6 +93,7 @@ angular.module('streama.translations').config(function ($translateProvider) { LANGUAGE_da: 'Dansk/덴마크 말', LANGUAGE_ar: 'عربى/아라비아 말', LANGUAGE_hu: 'Magyar/헝가리 인', + LANGUAGE_sk: 'Slovensky/Slovak', PROFIlE: { USERNAME: '아이디', FULL_NAME: '이름', diff --git a/grails-app/assets/javascripts/streama/translations/NL_nl.js b/grails-app/assets/javascripts/streama/translations/NL_nl.js index c0082098b..8208bd099 100644 --- a/grails-app/assets/javascripts/streama/translations/NL_nl.js +++ b/grails-app/assets/javascripts/streama/translations/NL_nl.js @@ -10,7 +10,8 @@ angular.module('streama.translations').config(function ($translateProvider) { PASSWORD: 'Wachtwoord', FIRST_TIME_HINT: 'Eerste keer dat u inlogt? Probeer \'admin\' voor gebruikersnaam en wachtwoord.', SUBMIT: 'Login', - SESSION_EXPIRED: 'Je sessie is verlopen sinds je laatste activiteit. Log alsjeblieft nogmaals in.' + SESSION_EXPIRED: 'Je sessie is verlopen sinds je laatste activiteit. Log alsjeblieft nogmaals in.', + FORGOT_PASSWORD: 'Wachtwoord vergeten?' }, DASHBOARD: { HOME: 'Huis', @@ -18,6 +19,7 @@ angular.module('streama.translations').config(function ($translateProvider) { MOVIES: 'Films', MY_LIST:'Mijn lijst', TITLE: 'Dashboard', + TITLE_COUNTER_OF: 'of', RECOMMENDATIONS: 'Aanbevelingen voor u', NEW_RELEASES: 'Nieuw uitgebracht', CONTINUE_WATCHING: 'Verder kijken', @@ -93,6 +95,7 @@ angular.module('streama.translations').config(function ($translateProvider) { LANGUAGE_da: 'Dansk/Deens', LANGUAGE_ar: 'عربى/Arabisch', LANGUAGE_hu: 'Magyar/Hongaars', + LANGUAGE_sk: 'Slovensky/Slovak', PROFIlE: { USERNAME: 'Gebruikersnaam', FULL_NAME: 'Volledige naam', diff --git a/grails-app/assets/javascripts/streama/translations/PT_br.js b/grails-app/assets/javascripts/streama/translations/PT_br.js index f78919077..0388f6b23 100644 --- a/grails-app/assets/javascripts/streama/translations/PT_br.js +++ b/grails-app/assets/javascripts/streama/translations/PT_br.js @@ -13,7 +13,8 @@ angular.module('streama.translations').config(function ($translateProvider) { PASSWORD: 'Senha', FIRST_TIME_HINT: 'Primeira vez fazendo login? Tente \'admin\' nos dois campos.', SUBMIT: 'Entrar', - SESSION_EXPIRED: 'Sua sessão expirou desde sua última atividade. Por favor faça login novamente.' + SESSION_EXPIRED: 'Sua sessão expirou desde sua última atividade. Por favor faça login novamente.', + FORGOT_PASSWORD: 'Esqueceu sua senha?' }, DASHBOARD: { HOME: 'Início', @@ -21,6 +22,7 @@ angular.module('streama.translations').config(function ($translateProvider) { MOVIES: 'Filmes', MY_LIST:'Minha lista', TITLE: 'Painel', + TITLE_COUNTER_OF: 'of', RECOMMENDATIONS: 'Sugestões para você', NEW_RELEASES: 'Novos lançamentos', CONTINUE_WATCHING: 'Continue assistindo', @@ -97,6 +99,7 @@ angular.module('streama.translations').config(function ($translateProvider) { LANGUAGE_da: 'Dansk/Dinamarquês', LANGUAGE_ar: 'عربى/Árabe', LANGUAGE_hu: 'Magyar/Húngaro', + LANGUAGE_sk: 'Slovensky/Slovak', PROFIlE: { USERNAME: 'Usuário', FULL_NAME: 'Nome completo', diff --git a/grails-app/assets/javascripts/streama/translations/Ru_ru.js b/grails-app/assets/javascripts/streama/translations/Ru_ru.js index e0907144b..1894e09dd 100644 --- a/grails-app/assets/javascripts/streama/translations/Ru_ru.js +++ b/grails-app/assets/javascripts/streama/translations/Ru_ru.js @@ -10,7 +10,8 @@ angular.module('streama.translations').config(function ($translateProvider) { PASSWORD: 'Пароль', FIRST_TIME_HINT: 'Впервые? Используйте \'admin\' в качестве логина и пароля для входа.', SUBMIT: 'Войти', - SESSION_EXPIRED: 'Ваша сессия истекла. Пожалуйста, войдите снова.' + SESSION_EXPIRED: 'Ваша сессия истекла. Пожалуйста, войдите снова.', + FORGOT_PASSWORD: 'Забыли пароль?' }, DASHBOARD: { HOME: 'Домашняя страница', @@ -18,6 +19,7 @@ angular.module('streama.translations').config(function ($translateProvider) { MOVIES: 'Фильмы', MY_LIST:'Мой список', TITLE: 'Главная', + TITLE_COUNTER_OF: 'of', RECOMMENDATIONS: 'Рекомендовано для вас', NEW_RELEASES: 'Новое на сайте', CONTINUE_WATCHING: 'Продолжить просмотр', diff --git a/grails-app/assets/javascripts/streama/translations/SK_sk.js b/grails-app/assets/javascripts/streama/translations/SK_sk.js new file mode 100644 index 000000000..591049930 --- /dev/null +++ b/grails-app/assets/javascripts/streama/translations/SK_sk.js @@ -0,0 +1,192 @@ +//= wrapped +/** + * Created by antonia on 14/05/16. + */ +angular.module('streama.translations').config(function ($translateProvider) { + $translateProvider.translations('sk', { + LOGIN: { + TITLE: 'Prihláste sa, prosím', + USERNAME: 'Meno používateľa', + PASSWORD: 'Heslo', + FIRST_TIME_HINT: 'Ste tu prvýkrát? Skúste \'admin\' pre obe polia.', + SUBMIT: 'Prihlásiť sa', + SESSION_EXPIRED: 'Vaše sedenie expirovalo z dôvodu Vašej neaktivity. Prosím, prihláste sa znovu.', + FORGOT_PASSWORD: 'Zabudli ste heslo?' + }, + DASHBOARD: { + HOME: 'Domov', + TV_SHOWS: 'Seriály', + MOVIES: 'Filmy', + MY_LIST:'Môj zoznam', + TITLE: 'Nástenka', + TITLE_COUNTER_OF: 'z', + RECOMMENDATIONS: 'Odporúčania pre Vás', + NEW_RELEASES: 'Novinky', + CONTINUE_WATCHING: 'Pokračovať v sledovaní', + DISCOVER_SHOWS: 'Objavujte seriály', + DISCOVER_MOVIES: 'Objavujte filmy', + DISCOVER_OTHER_VIDEOS: 'Objavujte iné videá', + SORT: 'Triedenie:', + SEARCH_BY_NAME: 'Hľadať podľa názvu...', + FILTER_BY_TAG: 'Filtrovať podľa značky...', + FILTER_BY_GENRE: 'Filtrovať podľa žánru...', + BROWSE_GENRES: 'Prehliadať žánre', + LOOKING_AT_GENRE: 'Sledujete žáner:', + MARK_COMPLETED: 'Označiť ako pozreté', + NO_TVSHOWS_FOUND: 'Nie sú dostupné žiadne seriály', + NO_WATCHLIST_FOUND: 'Ešte tu nič nie je', + NO_MOVIES_FOUND: 'Nie sú dostupné žiadne filmy', + WATCHLIST: 'Zoznam na pozeranie' + }, + VIDEO: { + RELEASED: 'Vydané', + IMDB: 'IMDB', + RATING: 'Hodnotenie', + STATUS: 'Stav', + STATUS_VALUE: { + 'completed': 'pozreté', + 'viewing': 'načaté', + 'unviewed': 'nepozreté' + }, + VOTES: 'Hlasy', + OVERVIEW: 'Prehľad', + GENRE: 'Žáner', + TRAILER: 'Ukážka', + SEASON: 'Sezóna', + SUBTITLES: 'Titulky', + NO_SUBTITLE: 'Bez titulkov', + SUBTITLE_SIZE: 'Veľkosti titulkov', + VIDEO_FILES: 'Zdroje videa', + UPNEXT: 'Ďalšie diely...' + }, + + MESSAGES: { + SHARE_SOCKET: 'Po vytvorení nového sedenia Vás presmerujeme naspäť na tento prehrávač, ale tentokrát bude súčasťou URL adresy unikátny identifikátor sedenia. Pošlite ho Vašim priateľom a zdieľajte tak s nimi zážitok zo spoločného sledovania!', + FILE_MISSING: 'Vyskytol sa problém s týmto obsahom. Zdá sa, že ste odstránili súvisiaci súbor s videom.', + CODEC_PROBLEM: 'Zdá sa, že sa objavil problém počas pridávania video súboru do prehrávača. Pravdepodobne to súvisí s kodekom. Skúste súbor prekonvertovať do kodeku kompatibilného s HTML5, odstráňte aktuálne pripojený súbor a pridajte nový. Ak sú kodeky v poriadku, pozrite si chybové hlásenie servera a základnú adresu URL v nastaveniach.', + WRONG_BASEPATH: 'Vaše video používa nesprávnu základnú adresu URL, stránku ale prezeráte prostredníctvom "{{basePath}}". Uistite sa, že máte správne nastavenú základnú adresu v nastaveniach a tiež, že ju používate pri navigácií v aplikácii.', + FILE_IN_FS_NOT_FOUND: 'Vaše video sa nepodarilo nájsť v žiadnom z umiestnení, ku ktorým ma aplikácia prístup. Prosím, skontrolujte nastavenia a systém súborov a uistite sa, že aplikácia má k súborom prístup.' + }, + MANAGE_CONTENT: 'Správa obsahu', + MANAGE_SUB_PROFILES: 'Správa profilov', + WHOS_WATCHING: 'Kto sleduje?', + ADD_SUB_PROFILE: 'Pridať profil', + EDIT_BTN: 'Upraviť', + DONE_BTN: 'Hotovo', + SAVE_BTN: 'Uložiť', + CREATE_BTN: 'Vytvoriť', + CANCEL_BTN: 'Zrušiť', + DELETE_BTN: 'Odstrániť', + ENTER_NAME: 'Zadajte meno', + EDIT_PROFILE: 'Upraviť profil', + CREATE_PROFILE: 'Vytvoriť profil', + ADMIN: 'Administrátor', + HELP: 'Pomocník', + HELP_FAQ: 'POMOCNÍK / ČASTÉ OTÁZKY', + PROFILE_SETTINGS: 'Nastavenia používateľa', + LOGOUT: 'Odhlásiť sa', + CHANGE_PASSWORD: 'Zmeniť heslo', + LANGUAGE_en: 'English/Anglicky', + LANGUAGE_cn: 'Čínsky/中文', + LANGUAGE_ru: 'Русский/Rusky', + LANGUAGE_de: 'Deutsch/Nemecky', + LANGUAGE_fr: 'Français/Francúzsky', + LANGUAGE_es: 'Español/Španielsky', + LANGUAGE_kr: '한국어/Kórejsky', + LANGUAGE_nl: 'Nederlands/Holandsky', + LANGUAGE_pt: 'Português/Portugalsky', + LANGUAGE_ja: '日本語/Japonsky', + LANGUAGE_it: 'Italiano/Taliansky', + LANGUAGE_da: 'Dansk/Dánsky', + LANGUAGE_ar: 'عربى/Arabsky', + LANGUAGE_hu: 'Magyar/Maďarsky', + LANGUAGE_sk: 'Slovak/Slovensky', + PROFIlE: { + USERNAME: 'Meno používateľa', + FULL_NAME: 'Meno a priezvisko', + LANGUAGE: 'Jazyk', + PAUSE_ON_CLICK: 'Pozastaviť video po kliknutí', + FAVORITE_GENRES: 'Obľúbené žánre', + AMOUNT_OF_MEDIA_ENTRIES: 'Počet videí na nástenke (pred "Načítať viac")', + SAVE: 'Uložiť profil', + PASS: 'Heslo', + OLD_PASS: 'Staré heslo', + NEW_PASS: 'Nové heslo', + NEW_PASS_PLACEHOLDER: 'Nové heslo (min. 6 znakov)', + REPEAT_PASS: 'Zopakujte heslo', + PASS_ERROR_EMPTY: 'Heslo nesmie byť prázdne', + PASS_ERROR_LENGTH: 'Heslo musí mať aspoň 6 znakov', + PASS_ERROR_REPEAT: 'Heslá sa musia zhodovať', + SAVE_PASS: 'Nastaviť nové heslo' + }, + + SORT_OPTIONS: { + AZ: 'A-Z', + ZA: 'Z-A', + NEWEST_ADDED: 'Najskôr pridané', + OLDEST_ADDED: 'Najneskoršie pridané', + NEWEST_RELEASED: 'Najskôr vydané', + OLDEST_RELEASED: 'Najneskoršie vydané', + NEWEST_AIRED: 'Najskôr vysielané', + OLDEST_AIRED: 'Najneskoršie vysielané', + NEWEST_REPORTED: 'Najskôr hlásené', + OLDEST_REPORTED: 'Najneskoršie hlásené', + NEWEST_UPDATED: 'Najskôr aktualizované', + OLDEST_UPDATED: 'Najneskoršie aktualizované' + }, + + FAQ: { + UPLOAD_VIDEO: { + TITLE: 'Ako môžem nahrať video?', + TEXT: "Videá môžete nahrať v ponuke Správa obsahu. Vyberte si, či chcete nahrať film, seriál alebo iné video. Vyberte zodpovedajúcu položku v ponuke " + + " na zvislej lište s navigáciou v ľavej časti obrazovky. Nahrať video môžete po kliknutí na tlačidlo Vytvoriť nový film/Seriál/Iné video alebo zadaním " + + " názvu videa, ktoré chcete nahrať do vyhľadávacej lišty a výberom príslušného videa z výsledkov hľadania. Následne môžete vyplniť informácie o videu " + + " buď ručne alebo s použitím informácií dostupných na TheMovieDB. Potom kliknutím na tlačidlo Správa súborov nahráte súbor s videom a titulkami." + }, + DELETE_VIDEO: { + TITLE: 'Ako môžem odstrániť video?', + TEXT: "Video môžete odstrániť zo stránky s informáciami o videu. Kliknite na Správa súborov a vyberte ikonu červeného odpadkového koša. Rovnako ho možno odstrániť kliknutím na Upraviť video a výberom " + + " Odstrániť video. Použit môžete aj Správcu súborov v ponuke Správa obsahu. Tu uvidíte všetky súbory, ktoré ste nahrali. Kliknite na " + + " ikonu červeného odpadkového koša, čím súbor odstránite." + }, + VIDEO_FORMATS: { + TITLE: 'Ktoré formáty videa sú podporované?', + TEXT: "Streama aktuálne podporuje iba formáty videa, ktoré podporuje prehrávač HTML5. Pomocou potiahnutia súboru do prázdneho panelu Vášho prehliadača môžete vyskúšať, či je Váš video súbor kompatibilný s HTML5 prehrávačom." + }, + SUBTITLES: { + TITLE: 'Ako môžem pridať titulky k videu?', + TEXT: "Titulky k videu môžete pridať kliknutím na tlačidlo Správa súborov, ktoré nájdete na stránke s informáciami o videu. Tu môžete potiahnuť súbory s titulkami." + + " V minulosti ste ich museli ručne previesť do kompatibilného formátu, ale to už neplatí! Teraz sa o to postará aplikácia." + }, + INVITE_USERS: { + TITLE: 'Ako môžem pozvať priateľov, aby so mnou sledovali pridané videá?', + TEXT:"Videá môžete zdieľať s Vašimi priateľmi tak, že im pošlete pozvánku na pripojenie na Váš server Streama. Prejdite do ponuky Používatelia a kliknite na tlačidlo Pozvať používateľa. Vyplňte pozvánkový formulár a " + + " vyberte rolu/e pozvaného. Používatelia s rolou Administrátor majú právo meniť používateľov a nastavenia. Používatelia s rolou Správca obsahu môžu upravovať obsah. Váš priateľ dostane upozornenie o pozvánke " + + "v e-mailovej správe. S Vašimi priateľmi môžete tiež zdieľať video sedenie kliknutím na tlačidlo Zdieľať v prehrávači videa a zaslaním URL adresy sedenia." + }, + BASE_URL: { + TITLE: "Čo je to základná URL adresa a ako ju mám nastaviť?", + TEXT: "Základná URL adresa sa používa vo videách a v odkaze s pozvánkou." + }, + NOTIFICATIONS: { + TITLE: "Čo sú notifikácie?", + TEXT: "Priateľov, ktorým ste poslali pozvánku môžete posielať upozornenia pri nahraní videa prostredníctvom notifikácií. Odoslať ich môžete tak, že ich pridáte do poradia upozornení kliknutím na tlačidlo " + + "Pridať notifikáciu, ktoré nájdete na stránke s informáciami o videu. Potom prejdite do ponuky Notifikácie a kliknite na tlačidlo Odoslať poradie." + }, + VIDEO_PLAYER_SHORTCUTS: { + TITLE: "Podporuje prehrávač videí klávesové skratky?", + TEXT: "Áno. Pozastaviť/pokračovať: medzera. Správa hlasitosti: šípka hore/dole. Pretáčanie videa dozadu/dopredu: šípkv vľavo/vpravo. Rýchle pretáčanie:" + + " control + šípka vľavo/vpravo. Celá obrazovka zap/vyp: alt + enter. Titulky zap/vyp: S, Stíšiť zvuk: M, Návrat na predchádzajúcu" + + " obrazovku: delete alebo backspace." + }, + FAVORITE_GENRES: { + TITLE: "Ako fungujú obľúbené žánre používateľa v Streame?", + TEXT: "Už onedlho..." + }, + USEFUL_LINKS: { + TITLE: "Užitočné odkazy", + TEXT: "Už onedlho..." + } + } + }); +}); diff --git a/grails-app/assets/javascripts/streama/translations/TR_tr.js b/grails-app/assets/javascripts/streama/translations/TR_tr.js new file mode 100644 index 000000000..61e4ff5b9 --- /dev/null +++ b/grails-app/assets/javascripts/streama/translations/TR_tr.js @@ -0,0 +1,203 @@ +//= wrapped +/** + * Created by panlazy on 28/09/20. + */ +angular.module("streama.translations").config(function ($translateProvider) { + $translateProvider.translations("tr", { + LOGIN: { + TITLE: "Giriş Yap", + USERNAME: "Kullanıcı adı", + PASSWORD: "Şifre", + FIRST_TIME_HINT: + "İlk defa mı giriş yapıyorsun? Kullanıcı adı ve şifre için 'admin'i dene.", + SUBMIT: "Giriş", + SESSION_EXPIRED: + "Son etkinliğinizden bu yana oturumunuz sona erdi. Lütfen tekrar giriş yapın.", + FORGOT_PASSWORD: "Şifrenizi mi unuttunuz?", + }, + DASHBOARD: { + HOME: "Ana Sayfa", + TV_SHOWS: "Diziler", + MOVIES: "Filmler", + MY_LIST: "Listem", + TITLE: "Sayfam", + TITLE_COUNTER_OF: 'of', + RECOMMENDATIONS: "Senin için öneriler", + NEW_RELEASES: "Yeni Çıkanlar", + CONTINUE_WATCHING: "İzlemeye devam et", + DISCOVER_SHOWS: "Dizileri Keşfet", + DISCOVER_MOVIES: "Filmleri Keşfet", + DISCOVER_OTHER_VIDEOS: "Diğer Videoları Keşfet", + SORT: "Sırala:", + SEARCH_BY_NAME: "İsme göre ara...", + FILTER_BY_TAG: "Etikete göre ara...", + FILTER_BY_GENRE: "Türe göre ara...", + BROWSE_GENRES: "Türlere Gözat", + LOOKING_AT_GENRE: "Şu türe göz atıyorsun:", + MARK_COMPLETED: "Tamamlandı olarak işaretle", + NO_TVSHOWS_FOUND: "Dizi mevcut değil", + NO_WATCHLIST_FOUND: "Burada herhangi birşey yok", + NO_MOVIES_FOUND: "Film mevcut değil", + WATCHLIST: "İzleme Listesi", + }, + VIDEO: { + RELEASED: "Yayınlandı", + IMDB: "IMDB", + RATING: "Derece", + VOTES: "Oy", + OVERVIEW: "Genel Bakış", + GENRE: "Tür", + TRAILER: "Fragman", + SEASON: "Sezon", + SUBTITLES: "Altyazılar", + NO_SUBTITLE: "Altyazı Yok", + SUBTITLE_SIZE: "Altyazı Boyutu", + VIDEO_FILES: "Video Kaynakları", + UPNEXT: "Bir Sonraki ...", + }, + + MESSAGES: { + SHARE_SOCKET: + "Yeni bir oturum oluşturarak bu oynatıcıya geri yönlendirileceksiniz, ancak bu sefer url'de benzersiz bir oturum kimliğine sahip olacaksınız. Senkronize bir izleme deneyimi yaşamak için bunu arkadaşlarınızla paylaşın!", + FILE_MISSING: + "Bu içerikle ilgili bir sorun var. İlişkili video dosyasını ondan kaldırmışsınız gibi görünüyor.", + CODEC_PROBLEM: + "Oynatıcıya video dosyasını eklerken bir sorun var gibi görünüyor. Bu büyük olasılıkla bir codec sorunundan kaynaklanmakta. Uyumlu bir HTML5 codec bileşenine dönüştürmeyi deneyin, şu anda ekli olan dosyayı kaldırın ve yeniden ekleyin. Codec bileşenlerinde sorun yoksa, sunucunun hata günlüğünü ve ayarlarda temel URL'yi kontrol edin.", + WRONG_BASEPATH: + 'Videonuz yanlış Temel Yol kullanılarak dahil ediliyor, ancak sayfaya "{{basePath}}" üzerinden göz atıyorsunuz. Ayarlarda doğru Temel Yolu ayarladığınızdan ve uygulamaya göz atmak için bunu kullandığınızdan emin olun.', + FILE_IN_FS_NOT_FOUND: + "Videonuz, uygulamanın kullanabileceği konumların hiçbirinde bulunamıyor. Dosyalara uygulama tarafından erişilebildiğinden emin olmak için lütfen ayarlarınızı ve dosya sisteminizi kontrol edin.", + }, + MANAGE_CONTENT: "İçerikleri Yönet", + MANAGE_SUB_PROFILES: "Profilleri Yönet", + WHOS_WATCHING: "Kim İzliyor?", + ADD_SUB_PROFILE: "Profil Ekle", + EDIT_BTN: "Düzenle", + DONE_BTN: "Tamam", + SAVE_BTN: "Kaydet", + CREATE_BTN: "Oluştur", + CANCEL_BTN: "İptal Et", + DELETE_BTN: "Sil", + ENTER_NAME: "İsim gir", + EDIT_PROFILE: "Profili düzenle", + CREATE_PROFILE: "Profil oluştur", + ADMIN: "Yönetici", + HELP: "Yardım", + HELP_FAQ: "YARDIM / S.S.S.", + PROFILE_SETTINGS: "Kullanıcı Ayarları", + LOGOUT: "Oturumu Kapat", + CHANGE_PASSWORD: "Şifreni Değiştir", + LANGUAGE_en: "English", + LANGUAGE_cn: "Chinese/中文", + LANGUAGE_ru: "Русский/Russian", + LANGUAGE_de: "Deutsch/German", + LANGUAGE_fr: "Français/French", + LANGUAGE_es: "Español/Spanish", + LANGUAGE_kr: "한국어/Korean", + LANGUAGE_nl: "Nederlands/Dutch", + LANGUAGE_pt: "Português/Portuguese", + LANGUAGE_ja: "日本語/Japanese", + LANGUAGE_it: "Italiano/Italian", + LANGUAGE_da: "Dansk/Danish", + LANGUAGE_ar: "عربى/Arabic", + LANGUAGE_hu: "Magyar/Hungarian", + LANGUAGE_tr: "Turkish/Türkçe", + PROFIlE: { + USERNAME: "Kullanıcı adı", + FULL_NAME: "Ad Soyad", + LANGUAGE: "Dil", + PAUSE_ON_CLICK: "Tıklandığında Videoyu Duraklat", + FAVORITE_GENRES: "Favori Türler", + AMOUNT_OF_MEDIA_ENTRIES: + 'Sayfam\'daki toplam video sayısı ("Daha Fazla Yükle" den önce)', + SAVE: "Profili Kaydet", + PASS: "Şifre", + OLD_PASS: "Eski Şifre", + NEW_PASS: "Yeni Şifre", + NEW_PASS_PLACEHOLDER: "Yeni Şifre (min. 6 karakter)", + REPEAT_PASS: "Şifreyi Tekrar Girin", + PASS_ERROR_EMPTY: "Şifre boş olamaz", + PASS_ERROR_LENGTH: "Şifre en az 6 karakter uzunluğunda olmalı", + PASS_ERROR_REPEAT: "Şifreler birbiriyle eşleşmeli", + SAVE_PASS: "Yeni şifre oluştur", + }, + + SORT_OPTIONS: { + AZ: "A-Z", + ZA: "Z-A", + NEWEST_ADDED: "En Son Eklenen", + OLDEST_ADDED: "İlk Eklenen", + NEWEST_RELEASED: "En Son Çıkan", + OLDEST_RELEASED: "En Eski Çıkan", + NEWEST_AIRED: "En Son Yayınlanan", + OLDEST_AIRED: "En Eski Yayınlanan", + NEWEST_REPORTED: "En Son Bildirilenler", + OLDEST_REPORTED: "En Eski Rapor", + NEWEST_UPDATED: "En Son Güncellenen", + OLDEST_UPDATED: "En Eski Güncellenen", + }, + + FAQ: { + UPLOAD_VIDEO: { + TITLE: "Nasıl video yükleyebilirim?", + TEXT: + "İçeriği Yönet menüsüne giderek video yükleyebilirsiniz. Bir Film, Dizi veya Başka bir video yüklemek isteyip istemediğinizi seçin. İlgili alt menü seçeneğine tıklayın" + + " ekranın sol tarafındaki dikey gezinme çubuğunda. Yeni Film / Dizi / Diğer Video Oluştur düğmesini tıklayarak veya yazarak bir video yükleyebilirsiniz." + + " arama çubuğuna yüklemek istediğiniz videonun adı ve arama sonuçlarından ilgili filmi seçin. Bundan sonra, videonun" + + " bilgileri manuel olarak veya TheMovieDB'den yükleyerek. Bundan sonra, Dosyaları Yönet düğmesine tıklayarak video ve altyazı dosyalarını yükleyebilirsiniz.", + }, + DELETE_VIDEO: { + TITLE: "Bir videoyu nasıl silebilirim?", + TEXT: + "Videonun bilgi sayfasına gidip Dosyaları Yönet'i tıklayıp kırmızı çöp kutusu simgesini seçerek videoyu silebilirsiniz. Filmi Düzenle'yi tıklayıp" + + " Filmi Sil, bunu yapmanın başka bir yoludur. İçeriği Yönet menüsündeki Dosya Yöneticisini de kullanabilirsiniz. Orada yüklediğiniz tüm dosyaları görebilirsiniz. " + + " bir dosyayı silmek için kırmızı çöp kutusu simgesine tıklayın.", + }, + VIDEO_FORMATS: { + TITLE: "Hangi video formatları destekleniyor?", + TEXT: + "Streama şu anda yalnızca HTML5 oynatıcı tarafından desteklenen video dosyası biçimlerini desteklemektedir. Dosyanızı tarayıcınızdaki boş bir sekmeye sürükleyip bırakarak video dosyanızın HTML5 oynatıcı ile uyumlu olup olmadığını test edebilirsiniz.", + }, + SUBTITLES: { + TITLE: "Videolara nasıl altyazı ekleyebilirim?", + TEXT: + "Videonun bilgi sayfasındaki Dosyaları Yönet düğmesini tıklayarak videolara altyazı ekleyebilirsiniz. Altyazı dosyalarını buraya sürükleyip bırakabilirsiniz." + + " Önceden bunları manuel olarak uyumlu bir dosya biçimine dönüştürmeniz gerekiyordu, ancak artık değil! Şimdi uygulama bunu sizin için hallediyor.", + }, + INVITE_USERS: { + TITLE: + "Arkadaşlarımı barındırılan videolarımı izlemeye nasıl davet edebilirim?", + TEXT: + "Videolarınızı, barındırılan Streama'nızı kullanmaya davet ederek arkadaşlarınızla paylaşabilirsiniz. Kullanıcılar menüsüne gidin ve Kullanıcı Davet Et düğmesini tıklayın. Davet formunu doldurun ve" + + " davetlinin rolünü / rollerini seçin. Yönetici rolüne sahip kullanıcılar, Kullanıcıları ve Ayarları düzenleyebilir. İçerik Yöneticisi rolüne sahip kullanıcılar içeriği düzenleyebilir. " + + " Arkadaşınız e-posta yoluyla davet hakkında bilgilendirilecek. Ayrıca video oynatıcının Paylaş düğmesini tıklayarak ve oturum URL'sini onlara bağlayarak video oturumlarını arkadaşlarınızla paylaşabilirsiniz.", + }, + BASE_URL: { + TITLE: "Temel URL nedir ve bunu nasıl yapılandırmalıyım?", + TEXT: + "Temel URL, videolar ve davet e-postasındaki bağlantı için kullanılır.", + }, + NOTIFICATIONS: { + TITLE: "Bildirimler nedir?", + TEXT: + "Davet ettiğiniz arkadaşlarınıza yüklenen videolar hakkında bildirim mesajları göndererek onları bilgilendirebilirsiniz." + + " Videonuzun bilgi sayfasındaki Bildirim Ekle düğmesine tıklayıp Bildirimler menüsüne gidip Sırayı Gönder düğmesine tıklayarak bildirim sıranıza ekleyerek gönderebilirsiniz.", + }, + VIDEO_PLAYER_SHORTCUTS: { + TITLE: "Video oynatıcıda kısayol tuşları var mı?", + TEXT: + "Evet. Duraklat/devam ettir: boşluk. Ses düzeyini yönetme: yukarı veya aşağı ok tuşları. Videoyu ileri/geri atlama: sol veya sağ ok tuşları. Uzun atlama:" + + " CTRL + ok tuşları sola veya sağa. Tam ekran açık/kapalı: ALT + Enter. Altyazı açık/kapalı: S, Sustur: M," + + " Önceki ekrana dön: Delete veya Backspace.", + }, + FAVORITE_GENRES: { + TITLE: "Kullanıcının favori türleri Streama'yı nasıl etkiler?", + TEXT: "Yakında...", + }, + USEFUL_LINKS: { + TITLE: "Kullanışlı bağlantılar", + TEXT: "Yakında...", + }, + }, + }); +}); diff --git a/grails-app/assets/stylesheets/_admin.scss b/grails-app/assets/stylesheets/_admin.scss index bd6584bae..cacf567ec 100644 --- a/grails-app/assets/stylesheets/_admin.scss +++ b/grails-app/assets/stylesheets/_admin.scss @@ -12,6 +12,7 @@ width: 300px; background: rgba(0, 0, 0, 0.15); border-right: 1px solid rgba(255, 255, 255, 0.11); + margin-top: 0.65em; @include flex(none); ul{ diff --git a/grails-app/assets/stylesheets/_dash.scss b/grails-app/assets/stylesheets/_dash.scss index 85ccfc61f..90ef484bc 100644 --- a/grails-app/assets/stylesheets/_dash.scss +++ b/grails-app/assets/stylesheets/_dash.scss @@ -5,6 +5,11 @@ h3{ font-size: 16px; text-transform: uppercase; + + .counter{ + text-transform: none; + font-weight: 100; + } } .genre-display{ @@ -33,6 +38,14 @@ left: 75px; bottom: 51px; } + .shuffle-icon{ + line-height: 1em; + font-size: 52px; + color: $primary; + position: relative; + left: 150px; + bottom: 102px; + } .remove-icon{ line-height: 1em; font-size: 52px; @@ -41,6 +54,9 @@ left: 75px; bottom: 51px; } +} +div.watchlist-button.ng-scope { + height: 0px; } legend{ border: none; @@ -111,7 +127,7 @@ } .owl-item{ .poster-image{ - width: auto; + width: 342px; } } @@ -154,6 +170,16 @@ text-shadow: 1px 1px 1px black; z-index: 9; } + .shuffle-icon{ + position: absolute; + bottom: 7px; + right: 21px; + line-height: 1em; + font-size: 31px; + color: $primary; + text-shadow: 1px 1px 1px black; + z-index: 9; + } .new-release-footer{ position: absolute; left: 342px; diff --git a/grails-app/assets/stylesheets/_main.scss b/grails-app/assets/stylesheets/_main.scss index 1e91a4b11..0566b0edc 100644 --- a/grails-app/assets/stylesheets/_main.scss +++ b/grails-app/assets/stylesheets/_main.scss @@ -1,113 +1,123 @@ -body{ - background-color: #25292B; +body { + background-color: #25292b; color: white; font-weight: 300; } -html, body { height: 100%; } +html, +body { + height: 100%; +} -h1,h2,h3,h4,h5,h6{ +h1, +h2, +h3, +h4, +h5, +h6 { color: white; } - -.page-container{ +.page-container { min-height: 100%; margin-bottom: -30px; - - &.is-child{ + &.is-child { background: $primary; - header.main{ - font-family: 'Indie Flower', cursive; + header.main { + font-family: "Indie Flower", cursive; } - .dash-search{ - input{ + .dash-search { + input { background: white; } - .form-control-feedback{ + .form-control-feedback { color: #257696; } } - .dashboard{ - font-family: 'Indie Flower', cursive; + .dashboard { + font-family: "Indie Flower", cursive; - hr{ + hr { border-color: darken($primary, 5%); } - h3{ - font-family: 'Indie Flower', cursive; + h3 { + font-family: "Indie Flower", cursive; font-size: 32px; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.25); } - .form-control{ + .form-control { background: white; font-size: 16px; border-radius: 20px; } - .ui-select-bootstrap input{ + .ui-select-bootstrap input { font-size: 16px; margin-bottom: 0; height: 1.55em; } } - .media-list-item{ + .media-list-item { border-radius: 40px; overflow: hidden; padding: 0; border: 4px solid white; } - .media-item{ - .play-text{ + .media-item { + .play-text { padding: 12px 30px; } - .info-icon{ + .info-icon { right: 25px; } } } } +.new_releases_header { + padding-top: 1em; +} + .page-container-push{ height: 30px; } -.footer{ +.footer { padding: 7px 15px; border-top: 1px solid rgba(255, 255, 255, 0.05); text-align: center; } -.version{ +.version { color: rgba(255, 255, 255, 0.3); font-size: 10px; font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; } -.logo{ +.logo { padding: 6px 0; position: relative; margin: 0 auto; display: block; - img{ + img { max-width: 130px; max-height: 31px; } - i{ + i { font-size: 0.85em; } - .spinner{ + .spinner { position: absolute; left: 142px; top: 20px; @@ -115,34 +125,37 @@ h1,h2,h3,h4,h5,h6{ } .navbar-collapse.collapsing, -.navbar-collapse.in{ +.navbar-collapse.in { clear: both; display: block; } - - -header.main{ +header.main { @include clearfix; - background-image: linear-gradient(to bottom, rgba(0,0,0,1), rgba(0,0,0,0)); - @include vendor-property('transition', 'background 0.5s'); + background-image: linear-gradient( + 90deg, + rgba(0, 0, 0, 1)0%, + rgba(0, 0, 0, 0.35) 100% + ); + @include vendor-property("transition", "background 0.5s"); padding: 5px 15px; - .navbar-nav{ + .navbar-nav { float: right; padding: 0; margin: 0; - >li{ + > li { list-style: none; display: inline-block; - >a{ + > a { color: white; - padding: 11px 10px; + padding: 1.03em 10px; + margin-right: 0.05em; display: block; - &.active{ + &.active { font-weight: bold; border-bottom: 1px solid $primary; } @@ -168,7 +181,7 @@ header.main{ display: flex; align-items: center; - &:hover{ + &:hover { background: #424242; } @@ -179,11 +192,9 @@ header.main{ } } } - } - -.navbar-toggle{ +.navbar-toggle { margin: 0; font-size: 30px; padding: 0 13px; @@ -193,48 +204,45 @@ header.main{ right: 7px; } -.content{ +.content { } -.dash-search{ +.dash-search { margin: 0; - padding: 8px 9px 8px 0px; + padding: 1.03em 9px 8px 0px; } - -.dropdown-menu>li{ - >a.typeahead-item{ +.dropdown-menu > li { + > a.typeahead-item { @include flexbox; @include align-items(center); padding: 7px; font-size: 14px; border-bottom: 1px solid rgba(255, 255, 255, 0.08); - img{ + img { margin-right: 10px; width: 50px; } - &.inactive{ + &.inactive { opacity: 0.5; } } - - &:last-child >a{ + &:last-child > a { border: none; } } -hr{ +hr { border-color: rgba(255, 255, 255, 0.08); } - -.sort-by{ +.sort-by { margin-left: 8px; - .btn{ - .caret{ + .btn { + .caret { margin-left: 8px; } } diff --git a/grails-app/assets/stylesheets/_media-display.scss b/grails-app/assets/stylesheets/_media-display.scss index a5c4846f9..bdfa38d56 100644 --- a/grails-app/assets/stylesheets/_media-display.scss +++ b/grails-app/assets/stylesheets/_media-display.scss @@ -66,6 +66,18 @@ @include vendor-property('transition', 'opacity .2s'); } + .shuffle-icon{ + position: absolute; + bottom: 7px; + left: 65px; + line-height: 1em; + font-size: 31px; + color: $primary; + text-shadow: 1px 1px 1px rgb(0, 0, 0); + opacity: 0; + @include vendor-property('transition', 'opacity .2s'); + } + .warning-icon{ opacity: 1; color: $danger; @@ -130,6 +142,7 @@ .complete-watching, .info-icon, .add-icon, + .shuffle-icon, .remove-icon, .play-text{ opacity: 1; @@ -305,6 +318,37 @@ overflow: hidden; } + .episode-languages { + margin: 4px 0 8px; + display: flex; + flex-wrap: wrap; + gap: 4px; + + .lang-badge { + display: inline-flex; + align-items: center; + gap: 3px; + font-size: 10px; + padding: 2px 6px; + border-radius: 3px; + background: rgba(255, 255, 255, 0.1); + color: rgba(255, 255, 255, 0.8); + + i { + font-size: 10px; + } + + &.audio { + background: rgba($primary, 0.2); + color: $primary; + } + + &.subtitle { + background: rgba(255, 255, 255, 0.08); + } + } + } + .media-item{ max-height: 150px; overflow: hidden; diff --git a/grails-app/assets/stylesheets/_misc.scss b/grails-app/assets/stylesheets/_misc.scss index 405bff5c0..ee2155195 100644 --- a/grails-app/assets/stylesheets/_misc.scss +++ b/grails-app/assets/stylesheets/_misc.scss @@ -41,3 +41,42 @@ streama-wysiwyg{ .ql-bubble .ql-tooltip { z-index: 999; } + +.hide-overflowing-name{ + overflow:hidden; + text-overflow:ellipsis; + max-width: 500px; + white-space: nowrap; +} + +.text-max-width-375{ + max-width: 375px; +} + +#flexible-control-buttons{ + display: flex; + justify-content: flex-end; + padding: 6px; +} + +.management-btn{ + margin-left: 3px; +} + +.align-label-with-subtitle-count{ + text-align: left; + padding-left: 5px; +} + +.align-th-action{ + width: 235px; + text-align: center; +} + +#checkSearchByHash{ + padding-left: 30px; +} + +.padding-btn-close{ + padding-right: 3px; +} diff --git a/grails-app/assets/stylesheets/_player-controls.scss b/grails-app/assets/stylesheets/_player-controls.scss index eae052fd8..3f04b98a8 100644 --- a/grails-app/assets/stylesheets/_player-controls.scss +++ b/grails-app/assets/stylesheets/_player-controls.scss @@ -432,6 +432,27 @@ max-height: 300px; overflow: auto; + .episode-thumb{ + width: 80px; + height: 45px; + @include flex(none); + margin-right: 10px; + overflow: hidden; + background: rgba(0, 0, 0, 0.3); + + img{ + width: 100%; + height: 100%; + object-fit: cover; + } + + .fallback-image{ + width: 100%; + height: 100%; + background: rgba(255, 255, 255, 0.1); + } + } + .episode-number{ width: 30px; float: left; diff --git a/grails-app/assets/stylesheets/_player.scss b/grails-app/assets/stylesheets/_player.scss index e53e484be..2c3e3f431 100644 --- a/grails-app/assets/stylesheets/_player.scss +++ b/grails-app/assets/stylesheets/_player.scss @@ -205,5 +205,65 @@ streama-video-player{ margin-right: 12px; } } + + .transcoding-overlay { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.85); + z-index: 100; + @include flexbox; + @include align-items(center); + @include justify-content(center); + + .transcoding-content { + text-align: center; + max-width: 400px; + padding: 40px; + + h3 { + margin: 20px 0 10px; + font-size: 24px; + font-weight: 400; + } + + p { + color: #999; + font-size: 14px; + margin-bottom: 20px; + } + + .transcoding-spinner { + position: relative; + top: auto; + left: auto; + margin: 0 auto; + } + + .transcoding-progress-bar { + width: 100%; + height: 4px; + background: rgba(255, 255, 255, 0.2); + border-radius: 2px; + overflow: hidden; + margin-bottom: 10px; + + .transcoding-progress-fill { + height: 100%; + background: $primary; + border-radius: 2px; + @include vendor-property('transition', 'width 0.3s ease'); + } + } + + .transcoding-progress-text { + color: $primary; + font-size: 16px; + font-weight: 500; + } + } + } } diff --git a/grails-app/assets/stylesheets/_profile.scss b/grails-app/assets/stylesheets/_profile.scss index 61a28ef1b..97ed8dbaf 100644 --- a/grails-app/assets/stylesheets/_profile.scss +++ b/grails-app/assets/stylesheets/_profile.scss @@ -1,13 +1,9 @@ .profile { - padding: 20px; + padding: 4em 1em 1em 1em; position: relative; overflow: hidden; } -.profile-select-dropdown{ - padding: 1px 5px; -} - .profile-heading{ max-width: 1000px; margin: 0 auto; diff --git a/grails-app/assets/stylesheets/_util.scss b/grails-app/assets/stylesheets/_util.scss index beb258c9f..fdc8cf7c4 100644 --- a/grails-app/assets/stylesheets/_util.scss +++ b/grails-app/assets/stylesheets/_util.scss @@ -269,6 +269,9 @@ a{ .text-sm{ font-size: 0.75em; } +.text-xs{ + font-size: 0.50em; +} diff --git a/grails-app/conf/application.groovy b/grails-app/conf/application.groovy index 37cd2a95f..dced3be84 100644 --- a/grails-app/conf/application.groovy +++ b/grails-app/conf/application.groovy @@ -51,6 +51,14 @@ grails.plugin.springsecurity.controllerAnnotations.staticRules = [ [pattern:'/tag/index', access :['IS_AUTHENTICATED_REMEMBERED']], [pattern:'/settings/index', access :['IS_AUTHENTICATED_REMEMBERED']], [pattern:'/report/save', access :['IS_AUTHENTICATED_REMEMBERED']], + [pattern:'/video/markCompleted', access :['IS_AUTHENTICATED_REMEMBERED']], + [pattern:'/video/markAsUnviewed', access :['IS_AUTHENTICATED_REMEMBERED']], + + [pattern:'/subtitles/get', access :['IS_AUTHENTICATED_REMEMBERED']], + [pattern:'/subtitles/download', access :['IS_AUTHENTICATED_REMEMBERED']], + [pattern:'/subtitles/save', access :['IS_AUTHENTICATED_REMEMBERED']], + [pattern:'/subtitles/setDefault', access :['IS_AUTHENTICATED_REMEMBERED']], + [pattern:'/subtitles/getVideoSubtitles', access :['IS_AUTHENTICATED_REMEMBERED']], [pattern:'/genericVideo/**', access :['ROLE_CONTENT_MANAGER']], [pattern:'/genre/**', access :['ROLE_CONTENT_MANAGER']], @@ -74,6 +82,7 @@ grails.plugin.springsecurity.controllerAnnotations.staticRules = [ [pattern:'/file/serve', access :['permitAll']], [pattern:'/user/current', access :['permitAll']], [pattern:'/invite/**', access :['permitAll']], + [pattern:'/passwordReset/**', access :['permitAll']], [pattern:'/assets/**', access :['permitAll']], [pattern:'/**/js/**', access :['permitAll']], [pattern:'/**/css/**', access :['permitAll']], diff --git a/grails-app/conf/application.yml b/grails-app/conf/application.yml index 7b3fd4cc6..f000ff41f 100644 --- a/grails-app/conf/application.yml +++ b/grails-app/conf/application.yml @@ -162,6 +162,8 @@ streama: - ^(?.*?)(?\d{1,3})x(?\d{2}).* # example: "Castle4x06DaemonsWebdl480pOktober242011rC.mkv(jkuzt).mp4" subtitles: ^.+\-(.+)\.(?:srt|vtt)$ + opensubtitleUrl: 'https://api.opensubtitles.com/api/v1' + uploadtypes: ['video/h264', 'video/mp4', 'video/mpeg', 'video/quicktime', 'video/webm', 'video/x-ms-wm', 'video/x-ms-wmv', 'video/x-msvideo', 'image/bmp', 'image/gif', 'image/jpeg', 'image/pjpeg', 'image/png', 'image/svg+xml', 'image/x-icon', 'image/x-png', 'application/x-subrip', 'text/plain', 'text/vtt', 'text/plain', @@ -175,12 +177,12 @@ grails.controllers.upload.maxRequestSize: 10000000000000 # 10TB grails.plugin.springsecurity.providerNames: - daoAuthenticationProvider - - ldapAuthProvider + # - ldapAuthProvider # Uncomment if LDAP is configured - anonymousAuthenticationProvider - rememberMeAuthenticationProvider # Uncomment and update the below to configure LDAP authentication -# http://grails-plugins.github.io/grails-spring-security-ldap/v3/index.html +# http://grails-plugins.github.io/grails-spring-security-ldap/v3/index.html #grails.plugin.springsecurity.ldap: # context: # managerDn: 'ldap' diff --git a/grails-app/conf/spring/resources.groovy b/grails-app/conf/spring/resources.groovy index a9fd61767..0969fb25d 100644 --- a/grails-app/conf/spring/resources.groovy +++ b/grails-app/conf/spring/resources.groovy @@ -1,7 +1,11 @@ +import org.springframework.web.client.RestTemplate import streama.LdapUserDetailsContextMapper // Place your Spring DSL code here beans = { ldapUserDetailsMapper(LdapUserDetailsContextMapper) { } + + restTemplate(RestTemplate) { + } } diff --git a/grails-app/controllers/streama/DashController.groovy b/grails-app/controllers/streama/DashController.groovy index a8f9197a4..970cbefc4 100644 --- a/grails-app/controllers/streama/DashController.groovy +++ b/grails-app/controllers/streama/DashController.groovy @@ -8,15 +8,13 @@ class DashController { def springSecurityService def videoService + def mediaService def listContinueWatching(){ User currentUser = springSecurityService.currentUser Long profileId = request.getHeader('profileId')?.toLong() Profile profile = Profile.findById(profileId) - - List viewingStatusList = videoService.listContinueWatching(currentUser, profile) - - return [viewingStatusList: viewingStatusList] + respond videoService.listContinueWatching(currentUser, profile, params) } def listShows(){ @@ -25,11 +23,11 @@ class DashController { } } - def listEpisodesForShow(TvShow tvShow){ + def listEpisodesForShow(TvShow tvShow) { respond tvShow.getFilteredEpisodes() } - def listRecommendations(){ + def listRecommendations() { User currentUser = springSecurityService.currentUser List
    diff --git a/grails-app/views/mail/notification.gsp b/grails-app/views/mail/notification.gsp index 52da74aa6..972157620 100644 --- a/grails-app/views/mail/notification.gsp +++ b/grails-app/views/mail/notification.gsp @@ -212,7 +212,7 @@ - +

    ${notification.movie.title} (${notification.movie.release_date?.substring(0,4)})

    @@ -231,7 +231,7 @@ - +

    ${notification.tvShow.name} (${notification.tvShow.first_air_date?.substring(0,4)})

    diff --git a/grails-app/views/mail/passwordReset.gsp b/grails-app/views/mail/passwordReset.gsp new file mode 100644 index 000000000..d21b489ee --- /dev/null +++ b/grails-app/views/mail/passwordReset.gsp @@ -0,0 +1,223 @@ + +<%@ page import="streama.Settings" contentType="text/html"%> + + + + + + Password Reset Request + + + + + + + + + + + + + + + +
    + +
    + + + + + +
    +

    Password Reset Request

    +

    We received a request to reset your password. Click the button below to set a new password.

    +

    If you didn't request this, you can safely ignore this email.

    + + + + +
    +

    + Reset Password +

    +

    This link will expire in 30 minutes.

    + +
    +
    + + +
    + + + + + diff --git a/grails-app/views/movie/_movie.gson b/grails-app/views/movie/_movie.gson index 69818056b..98f0632cf 100644 --- a/grails-app/views/movie/_movie.gson +++ b/grails-app/views/movie/_movie.gson @@ -10,6 +10,7 @@ json g.render(movie, [deep:true, excludes: ['poster_image']]){ files movie.files?.collect{it.simpleInstance} videoFiles movie.getVideoFiles()*.getSimpleInstance() subtitles movie.getSubtitles()*.getSimpleInstance() + poster_path movie.getPosterPath() poster_image_src movie.poster_image?.src inWatchlist movie.inWatchlist() status movie.getStatus() diff --git a/grails-app/views/notificationQueue/_notificationQueue.gson b/grails-app/views/notificationQueue/_notificationQueue.gson index 1ab1e0077..810388fa3 100644 --- a/grails-app/views/notificationQueue/_notificationQueue.gson +++ b/grails-app/views/notificationQueue/_notificationQueue.gson @@ -7,7 +7,7 @@ model { json g.render(notificationQueue){ if(notificationQueue.movie){ movie { - poster_path notificationQueue.movie?.poster_image + poster_path notificationQueue.movie?.getPosterPath() title notificationQueue.movie?.title release_date notificationQueue.movie?.release_date } @@ -15,7 +15,7 @@ json g.render(notificationQueue){ if(notificationQueue.tvShow){ tvShow { - poster_path notificationQueue.tvShow?.poster_path + poster_path notificationQueue.tvShow?.getPosterPath() name notificationQueue.tvShow?.name first_air_date notificationQueue.tvShow?.first_air_date } diff --git a/grails-app/views/passwordReset/expired.gsp b/grails-app/views/passwordReset/expired.gsp new file mode 100644 index 000000000..71ab6a789 --- /dev/null +++ b/grails-app/views/passwordReset/expired.gsp @@ -0,0 +1,47 @@ + + + + + + ${streama.Settings.findByName('title').value} - Link Expired + + + + + + + +
  • -
  • {{'DASHBOARD.TITLE' | translate}}
  • +
  • + {{'DASHBOARD.TITLE' | translate}} +
  • diff --git a/grails-app/views/templates/_header_anonymous.gsp b/grails-app/views/templates/_header_anonymous.gsp index 101c6bd25..0531f2a98 100644 --- a/grails-app/views/templates/_header_anonymous.gsp +++ b/grails-app/views/templates/_header_anonymous.gsp @@ -1,5 +1,5 @@ <%@ page import="streama.Settings" %> -