ionic-rails-engine 0.9.9.11 → 0.9.17
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/README.md +1 -1
- data/app/assets/fonts/ionic/ionicons.eot +0 -0
- data/app/assets/fonts/ionic/ionicons.svg +543 -819
- data/app/assets/fonts/ionic/ionicons.ttf +0 -0
- data/app/assets/fonts/ionic/ionicons.woff +0 -0
- data/app/assets/javascripts/ionic/ionic-angular.js +2027 -7761
- data/app/assets/javascripts/ionic/ionic-angular.min.js +5 -7
- data/app/assets/javascripts/ionic/ionic.js +1828 -3310
- data/app/assets/javascripts/ionic/ionic.min.js +6 -7
- data/app/assets/stylesheets/ionic/ionic.css.erb +2107 -3212
- data/app/assets/stylesheets/ionic/ionic.min.css.erb +7 -7
- data/app/assets/stylesheets/ionic/themes/ionic-ios7.css +150 -0
- data/app/assets/stylesheets/ionic/themes/ionic-ios7.min.css +13 -0
- data/gem-public_cert.pem +10 -11
- data/lib/ionic-rails-engine/version.rb +1 -1
- metadata +14 -17
- metadata.gz.sig +3 -2
- data/app/assets/javascripts/angular-ui/angular-ui-router.js +0 -3223
- data/app/assets/javascripts/angular-ui/angular-ui-router.min.js +0 -7
- data/app/assets/javascripts/ionic/ionic.bundle.js +0 -43371
- data/app/assets/javascripts/ionic/ionic.bundle.min.js +0 -341
@@ -1,18 +1,18 @@
|
|
1
|
-
|
2
|
-
* Copyright
|
1
|
+
@charset "UTF-8";/*!
|
2
|
+
* Copyright 2013 Drifty Co.
|
3
3
|
* http://drifty.com/
|
4
4
|
*
|
5
|
-
* Ionic,
|
5
|
+
* Ionic, v0.9.17
|
6
6
|
* A powerful HTML5 mobile app framework.
|
7
7
|
* http://ionicframework.com/
|
8
8
|
*
|
9
|
-
* By @maxlynch, @
|
9
|
+
* By @maxlynch, @helloimben, @adamdbradley <3
|
10
10
|
*
|
11
11
|
* Licensed under the MIT license. Please see LICENSE for more information.
|
12
12
|
*
|
13
13
|
*//*!
|
14
|
-
Ionicons, v1.
|
14
|
+
Ionicons, v1.4.0
|
15
15
|
Created by Ben Sperry for the Ionic Framework, http://ionicons.com/
|
16
|
-
https://twitter.com/
|
16
|
+
https://twitter.com/helloimben https://twitter.com/ionicframework
|
17
17
|
MIT License: https://github.com/driftyco/ionicons
|
18
|
-
*/@font-face{font-family:Ionicons;src:url("<%= font_path('ionic/ionicons.eot') %>?v=1.5.2");src:url("<%= font_path('ionic/ionicons.eot') %>?v=1.5.2#iefix") format("embedded-opentype"),url("<%= font_path('ionic/ionicons.ttf') %>?v=1.5.2") format("truetype"),url("<%= font_path('ionic/ionicons.woff') %>?v=1.5.2") format("woff"),url("<%= font_path('ionic/ionicons.svg') %>?v=1.5.2#Ionicons") format("svg");font-weight:400;font-style:normal}.ion,.ion-alert-circled:before,.ion-alert:before,.ion-android-add-contact:before,.ion-android-add:before,.ion-android-alarm:before,.ion-android-archive:before,.ion-android-arrow-back:before,.ion-android-arrow-down-left:before,.ion-android-arrow-down-right:before,.ion-android-arrow-forward:before,.ion-android-arrow-up-left:before,.ion-android-arrow-up-right:before,.ion-android-battery:before,.ion-android-book:before,.ion-android-calendar:before,.ion-android-call:before,.ion-android-camera:before,.ion-android-chat:before,.ion-android-checkmark:before,.ion-android-clock:before,.ion-android-close:before,.ion-android-contact:before,.ion-android-contacts:before,.ion-android-data:before,.ion-android-developer:before,.ion-android-display:before,.ion-android-download:before,.ion-android-drawer:before,.ion-android-dropdown:before,.ion-android-earth:before,.ion-android-folder:before,.ion-android-forums:before,.ion-android-friends:before,.ion-android-hand:before,.ion-android-image:before,.ion-android-inbox:before,.ion-android-information:before,.ion-android-keypad:before,.ion-android-lightbulb:before,.ion-android-locate:before,.ion-android-location:before,.ion-android-mail:before,.ion-android-microphone:before,.ion-android-mixer:before,.ion-android-more:before,.ion-android-note:before,.ion-android-playstore:before,.ion-android-printer:before,.ion-android-promotion:before,.ion-android-reminder:before,.ion-android-remove:before,.ion-android-search:before,.ion-android-send:before,.ion-android-settings:before,.ion-android-share:before,.ion-android-social-user:before,.ion-android-social:before,.ion-android-sort:before,.ion-android-stair-drawer:before,.ion-android-star:before,.ion-android-stopwatch:before,.ion-android-storage:before,.ion-android-system-back:before,.ion-android-system-home:before,.ion-android-system-windows:before,.ion-android-timer:before,.ion-android-trash:before,.ion-android-user-menu:before,.ion-android-volume:before,.ion-android-wifi:before,.ion-aperture:before,.ion-archive:before,.ion-arrow-down-a:before,.ion-arrow-down-b:before,.ion-arrow-down-c:before,.ion-arrow-expand:before,.ion-arrow-graph-down-left:before,.ion-arrow-graph-down-right:before,.ion-arrow-graph-up-left:before,.ion-arrow-graph-up-right:before,.ion-arrow-left-a:before,.ion-arrow-left-b:before,.ion-arrow-left-c:before,.ion-arrow-move:before,.ion-arrow-resize:before,.ion-arrow-return-left:before,.ion-arrow-return-right:before,.ion-arrow-right-a:before,.ion-arrow-right-b:before,.ion-arrow-right-c:before,.ion-arrow-shrink:before,.ion-arrow-swap:before,.ion-arrow-up-a:before,.ion-arrow-up-b:before,.ion-arrow-up-c:before,.ion-asterisk:before,.ion-at:before,.ion-bag:before,.ion-battery-charging:before,.ion-battery-empty:before,.ion-battery-full:before,.ion-battery-half:before,.ion-battery-low:before,.ion-beaker:before,.ion-beer:before,.ion-bluetooth:before,.ion-bonfire:before,.ion-bookmark:before,.ion-briefcase:before,.ion-bug:before,.ion-calculator:before,.ion-calendar:before,.ion-camera:before,.ion-card:before,.ion-cash:before,.ion-chatbox-working:before,.ion-chatbox:before,.ion-chatboxes:before,.ion-chatbubble-working:before,.ion-chatbubble:before,.ion-chatbubbles:before,.ion-checkmark-circled:before,.ion-checkmark-round:before,.ion-checkmark:before,.ion-chevron-down:before,.ion-chevron-left:before,.ion-chevron-right:before,.ion-chevron-up:before,.ion-clipboard:before,.ion-clock:before,.ion-close-circled:before,.ion-close-round:before,.ion-close:before,.ion-closed-captioning:before,.ion-cloud:before,.ion-code-download:before,.ion-code-working:before,.ion-code:before,.ion-coffee:before,.ion-compass:before,.ion-compose:before,.ion-connection-bars:before,.ion-contrast:before,.ion-cube:before,.ion-disc:before,.ion-document-text:before,.ion-document:before,.ion-drag:before,.ion-earth:before,.ion-edit:before,.ion-egg:before,.ion-eject:before,.ion-email:before,.ion-eye-disabled:before,.ion-eye:before,.ion-female:before,.ion-filing:before,.ion-film-marker:before,.ion-fireball:before,.ion-flag:before,.ion-flame:before,.ion-flash-off:before,.ion-flash:before,.ion-flask:before,.ion-folder:before,.ion-fork-repo:before,.ion-fork:before,.ion-forward:before,.ion-funnel:before,.ion-game-controller-a:before,.ion-game-controller-b:before,.ion-gear-a:before,.ion-gear-b:before,.ion-grid:before,.ion-hammer:before,.ion-happy:before,.ion-headphone:before,.ion-heart-broken:before,.ion-heart:before,.ion-help-buoy:before,.ion-help-circled:before,.ion-help:before,.ion-home:before,.ion-icecream:before,.ion-icon-social-google-plus-outline:before,.ion-icon-social-google-plus:before,.ion-image:before,.ion-images:before,.ion-information-circled:before,.ion-information:before,.ion-ionic:before,.ion-ios7-alarm-outline:before,.ion-ios7-alarm:before,.ion-ios7-albums-outline:before,.ion-ios7-albums:before,.ion-ios7-americanfootball-outline:before,.ion-ios7-americanfootball:before,.ion-ios7-analytics-outline:before,.ion-ios7-analytics:before,.ion-ios7-arrow-back:before,.ion-ios7-arrow-down:before,.ion-ios7-arrow-forward:before,.ion-ios7-arrow-left:before,.ion-ios7-arrow-right:before,.ion-ios7-arrow-thin-down:before,.ion-ios7-arrow-thin-left:before,.ion-ios7-arrow-thin-right:before,.ion-ios7-arrow-thin-up:before,.ion-ios7-arrow-up:before,.ion-ios7-at-outline:before,.ion-ios7-at:before,.ion-ios7-barcode-outline:before,.ion-ios7-barcode:before,.ion-ios7-baseball-outline:before,.ion-ios7-baseball:before,.ion-ios7-basketball-outline:before,.ion-ios7-basketball:before,.ion-ios7-bell-outline:before,.ion-ios7-bell:before,.ion-ios7-bolt-outline:before,.ion-ios7-bolt:before,.ion-ios7-bookmarks-outline:before,.ion-ios7-bookmarks:before,.ion-ios7-box-outline:before,.ion-ios7-box:before,.ion-ios7-briefcase-outline:before,.ion-ios7-briefcase:before,.ion-ios7-browsers-outline:before,.ion-ios7-browsers:before,.ion-ios7-calculator-outline:before,.ion-ios7-calculator:before,.ion-ios7-calendar-outline:before,.ion-ios7-calendar:before,.ion-ios7-camera-outline:before,.ion-ios7-camera:before,.ion-ios7-cart-outline:before,.ion-ios7-cart:before,.ion-ios7-chatboxes-outline:before,.ion-ios7-chatboxes:before,.ion-ios7-chatbubble-outline:before,.ion-ios7-chatbubble:before,.ion-ios7-checkmark-empty:before,.ion-ios7-checkmark-outline:before,.ion-ios7-checkmark:before,.ion-ios7-circle-filled:before,.ion-ios7-circle-outline:before,.ion-ios7-clock-outline:before,.ion-ios7-clock:before,.ion-ios7-close-empty:before,.ion-ios7-close-outline:before,.ion-ios7-close:before,.ion-ios7-cloud-download-outline:before,.ion-ios7-cloud-download:before,.ion-ios7-cloud-outline:before,.ion-ios7-cloud-upload-outline:before,.ion-ios7-cloud-upload:before,.ion-ios7-cloud:before,.ion-ios7-cloudy-night-outline:before,.ion-ios7-cloudy-night:before,.ion-ios7-cloudy-outline:before,.ion-ios7-cloudy:before,.ion-ios7-cog-outline:before,.ion-ios7-cog:before,.ion-ios7-compose-outline:before,.ion-ios7-compose:before,.ion-ios7-contact-outline:before,.ion-ios7-contact:before,.ion-ios7-copy-outline:before,.ion-ios7-copy:before,.ion-ios7-download-outline:before,.ion-ios7-download:before,.ion-ios7-drag:before,.ion-ios7-email-outline:before,.ion-ios7-email:before,.ion-ios7-expand:before,.ion-ios7-eye-outline:before,.ion-ios7-eye:before,.ion-ios7-fastforward-outline:before,.ion-ios7-fastforward:before,.ion-ios7-filing-outline:before,.ion-ios7-filing:before,.ion-ios7-film-outline:before,.ion-ios7-film:before,.ion-ios7-flag-outline:before,.ion-ios7-flag:before,.ion-ios7-folder-outline:before,.ion-ios7-folder:before,.ion-ios7-football-outline:before,.ion-ios7-football:before,.ion-ios7-gear-outline:before,.ion-ios7-gear:before,.ion-ios7-glasses-outline:before,.ion-ios7-glasses:before,.ion-ios7-heart-outline:before,.ion-ios7-heart:before,.ion-ios7-help-empty:before,.ion-ios7-help-outline:before,.ion-ios7-help:before,.ion-ios7-home-outline:before,.ion-ios7-home:before,.ion-ios7-infinite-outline:before,.ion-ios7-infinite:before,.ion-ios7-information-empty:before,.ion-ios7-information-outline:before,.ion-ios7-information:before,.ion-ios7-ionic-outline:before,.ion-ios7-keypad-outline:before,.ion-ios7-keypad:before,.ion-ios7-lightbulb-outline:before,.ion-ios7-lightbulb:before,.ion-ios7-location-outline:before,.ion-ios7-location:before,.ion-ios7-locked-outline:before,.ion-ios7-locked:before,.ion-ios7-loop-strong:before,.ion-ios7-loop:before,.ion-ios7-medkit-outline:before,.ion-ios7-medkit:before,.ion-ios7-mic-off:before,.ion-ios7-mic-outline:before,.ion-ios7-mic:before,.ion-ios7-minus-empty:before,.ion-ios7-minus-outline:before,.ion-ios7-minus:before,.ion-ios7-monitor-outline:before,.ion-ios7-monitor:before,.ion-ios7-moon-outline:before,.ion-ios7-moon:before,.ion-ios7-more-outline:before,.ion-ios7-more:before,.ion-ios7-musical-note:before,.ion-ios7-musical-notes:before,.ion-ios7-navigate-outline:before,.ion-ios7-navigate:before,.ion-ios7-paper-outline:before,.ion-ios7-paper:before,.ion-ios7-paperplane-outline:before,.ion-ios7-paperplane:before,.ion-ios7-partlysunny-outline:before,.ion-ios7-partlysunny:before,.ion-ios7-pause-outline:before,.ion-ios7-pause:before,.ion-ios7-paw-outline:before,.ion-ios7-paw:before,.ion-ios7-people-outline:before,.ion-ios7-people:before,.ion-ios7-person-outline:before,.ion-ios7-person:before,.ion-ios7-personadd-outline:before,.ion-ios7-personadd:before,.ion-ios7-photos-outline:before,.ion-ios7-photos:before,.ion-ios7-pie-outline:before,.ion-ios7-pie:before,.ion-ios7-play-outline:before,.ion-ios7-play:before,.ion-ios7-plus-empty:before,.ion-ios7-plus-outline:before,.ion-ios7-plus:before,.ion-ios7-pricetag-outline:before,.ion-ios7-pricetag:before,.ion-ios7-pricetags-outline:before,.ion-ios7-pricetags:before,.ion-ios7-printer-outline:before,.ion-ios7-printer:before,.ion-ios7-pulse-strong:before,.ion-ios7-pulse:before,.ion-ios7-rainy-outline:before,.ion-ios7-rainy:before,.ion-ios7-recording-outline:before,.ion-ios7-recording:before,.ion-ios7-redo-outline:before,.ion-ios7-redo:before,.ion-ios7-refresh-empty:before,.ion-ios7-refresh-outline:before,.ion-ios7-refresh:before,.ion-ios7-reload:before,.ion-ios7-reloading,.ion-ios7-reloading:before,.ion-ios7-reverse-camera-outline:before,.ion-ios7-reverse-camera:before,.ion-ios7-rewind-outline:before,.ion-ios7-rewind:before,.ion-ios7-search-strong:before,.ion-ios7-search:before,.ion-ios7-settings-strong:before,.ion-ios7-settings:before,.ion-ios7-shrink:before,.ion-ios7-skipbackward-outline:before,.ion-ios7-skipbackward:before,.ion-ios7-skipforward-outline:before,.ion-ios7-skipforward:before,.ion-ios7-snowy:before,.ion-ios7-speedometer-outline:before,.ion-ios7-speedometer:before,.ion-ios7-star-half:before,.ion-ios7-star-outline:before,.ion-ios7-star:before,.ion-ios7-stopwatch-outline:before,.ion-ios7-stopwatch:before,.ion-ios7-sunny-outline:before,.ion-ios7-sunny:before,.ion-ios7-telephone-outline:before,.ion-ios7-telephone:before,.ion-ios7-tennisball-outline:before,.ion-ios7-tennisball:before,.ion-ios7-thunderstorm-outline:before,.ion-ios7-thunderstorm:before,.ion-ios7-time-outline:before,.ion-ios7-time:before,.ion-ios7-timer-outline:before,.ion-ios7-timer:before,.ion-ios7-toggle-outline:before,.ion-ios7-toggle:before,.ion-ios7-trash-outline:before,.ion-ios7-trash:before,.ion-ios7-undo-outline:before,.ion-ios7-undo:before,.ion-ios7-unlocked-outline:before,.ion-ios7-unlocked:before,.ion-ios7-upload-outline:before,.ion-ios7-upload:before,.ion-ios7-videocam-outline:before,.ion-ios7-videocam:before,.ion-ios7-volume-high:before,.ion-ios7-volume-low:before,.ion-ios7-wineglass-outline:before,.ion-ios7-wineglass:before,.ion-ios7-world-outline:before,.ion-ios7-world:before,.ion-ipad:before,.ion-iphone:before,.ion-ipod:before,.ion-jet:before,.ion-key:before,.ion-knife:before,.ion-laptop:before,.ion-leaf:before,.ion-levels:before,.ion-lightbulb:before,.ion-link:before,.ion-load-a:before,.ion-load-b:before,.ion-load-c:before,.ion-load-d:before,.ion-loading-a,.ion-loading-a:before,.ion-loading-b,.ion-loading-b:before,.ion-loading-c,.ion-loading-c:before,.ion-loading-d,.ion-loading-d:before,.ion-location:before,.ion-locked:before,.ion-log-in:before,.ion-log-out:before,.ion-loop:before,.ion-looping,.ion-looping:before,.ion-magnet:before,.ion-male:before,.ion-man:before,.ion-map:before,.ion-medkit:before,.ion-merge:before,.ion-mic-a:before,.ion-mic-b:before,.ion-mic-c:before,.ion-minus-circled:before,.ion-minus-round:before,.ion-minus:before,.ion-model-s:before,.ion-monitor:before,.ion-more:before,.ion-mouse:before,.ion-music-note:before,.ion-navicon-round:before,.ion-navicon:before,.ion-navigate:before,.ion-network:before,.ion-no-smoking:before,.ion-nuclear:before,.ion-outlet:before,.ion-paper-airplane:before,.ion-paperclip:before,.ion-pause:before,.ion-person-add:before,.ion-person-stalker:before,.ion-person:before,.ion-pie-graph:before,.ion-pin:before,.ion-pinpoint:before,.ion-pizza:before,.ion-plane:before,.ion-planet:before,.ion-play:before,.ion-playstation:before,.ion-plus-circled:before,.ion-plus-round:before,.ion-plus:before,.ion-podium:before,.ion-pound:before,.ion-power:before,.ion-pricetag:before,.ion-pricetags:before,.ion-printer:before,.ion-pull-request:before,.ion-qr-scanner:before,.ion-quote:before,.ion-radio-waves:before,.ion-record:before,.ion-refresh:before,.ion-refreshing,.ion-refreshing:before,.ion-reply-all:before,.ion-reply:before,.ion-ribbon-a:before,.ion-ribbon-b:before,.ion-sad:before,.ion-scissors:before,.ion-search:before,.ion-settings:before,.ion-share:before,.ion-shuffle:before,.ion-skip-backward:before,.ion-skip-forward:before,.ion-social-android-outline:before,.ion-social-android:before,.ion-social-apple-outline:before,.ion-social-apple:before,.ion-social-bitcoin-outline:before,.ion-social-bitcoin:before,.ion-social-buffer-outline:before,.ion-social-buffer:before,.ion-social-designernews-outline:before,.ion-social-designernews:before,.ion-social-dribbble-outline:before,.ion-social-dribbble:before,.ion-social-dropbox-outline:before,.ion-social-dropbox:before,.ion-social-facebook-outline:before,.ion-social-facebook:before,.ion-social-foursquare-outline:before,.ion-social-foursquare:before,.ion-social-freebsd-devil:before,.ion-social-github-outline:before,.ion-social-github:before,.ion-social-google-outline:before,.ion-social-google:before,.ion-social-googleplus-outline:before,.ion-social-googleplus:before,.ion-social-hackernews-outline:before,.ion-social-hackernews:before,.ion-social-instagram-outline:before,.ion-social-instagram:before,.ion-social-linkedin-outline:before,.ion-social-linkedin:before,.ion-social-pinterest-outline:before,.ion-social-pinterest:before,.ion-social-reddit-outline:before,.ion-social-reddit:before,.ion-social-rss-outline:before,.ion-social-rss:before,.ion-social-skype-outline:before,.ion-social-skype:before,.ion-social-tumblr-outline:before,.ion-social-tumblr:before,.ion-social-tux:before,.ion-social-twitter-outline:before,.ion-social-twitter:before,.ion-social-usd-outline:before,.ion-social-usd:before,.ion-social-vimeo-outline:before,.ion-social-vimeo:before,.ion-social-windows-outline:before,.ion-social-windows:before,.ion-social-wordpress-outline:before,.ion-social-wordpress:before,.ion-social-yahoo-outline:before,.ion-social-yahoo:before,.ion-social-youtube-outline:before,.ion-social-youtube:before,.ion-speakerphone:before,.ion-speedometer:before,.ion-spoon:before,.ion-star:before,.ion-stats-bars:before,.ion-steam:before,.ion-stop:before,.ion-thermometer:before,.ion-thumbsdown:before,.ion-thumbsup:before,.ion-toggle-filled:before,.ion-toggle:before,.ion-trash-a:before,.ion-trash-b:before,.ion-trophy:before,.ion-umbrella:before,.ion-university:before,.ion-unlocked:before,.ion-upload:before,.ion-usb:before,.ion-videocamera:before,.ion-volume-high:before,.ion-volume-low:before,.ion-volume-medium:before,.ion-volume-mute:before,.ion-wand:before,.ion-waterdrop:before,.ion-wifi:before,.ion-wineglass:before,.ion-woman:before,.ion-wrench:before,.ion-xbox:before,.ionicons{display:inline-block;font-family:Ionicons;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;text-rendering:auto;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ion-ios7-reloading,.ion-loading-a,.ion-loading-b,.ion-loading-c,.ion-loading-d,.ion-looping,.ion-refreshing,.ion-spin{-webkit-animation:spin 1s infinite linear;-moz-animation:spin 1s infinite linear;-o-animation:spin 1s infinite linear;animation:spin 1s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)}100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}.ion-loading-a{-webkit-animation-timing-function:steps(8,start);-moz-animation-timing-function:steps(8,start);animation-timing-function:steps(8,start)}.ion-alert:before{content:"\f101"}.ion-alert-circled:before{content:"\f100"}.ion-android-add:before{content:"\f2c7"}.ion-android-add-contact:before{content:"\f2c6"}.ion-android-alarm:before{content:"\f2c8"}.ion-android-archive:before{content:"\f2c9"}.ion-android-arrow-back:before{content:"\f2ca"}.ion-android-arrow-down-left:before{content:"\f2cb"}.ion-android-arrow-down-right:before{content:"\f2cc"}.ion-android-arrow-forward:before{content:"\f30f"}.ion-android-arrow-up-left:before{content:"\f2cd"}.ion-android-arrow-up-right:before{content:"\f2ce"}.ion-android-battery:before{content:"\f2cf"}.ion-android-book:before{content:"\f2d0"}.ion-android-calendar:before{content:"\f2d1"}.ion-android-call:before{content:"\f2d2"}.ion-android-camera:before{content:"\f2d3"}.ion-android-chat:before{content:"\f2d4"}.ion-android-checkmark:before{content:"\f2d5"}.ion-android-clock:before{content:"\f2d6"}.ion-android-close:before{content:"\f2d7"}.ion-android-contact:before{content:"\f2d8"}.ion-android-contacts:before{content:"\f2d9"}.ion-android-data:before{content:"\f2da"}.ion-android-developer:before{content:"\f2db"}.ion-android-display:before{content:"\f2dc"}.ion-android-download:before{content:"\f2dd"}.ion-android-drawer:before{content:"\f310"}.ion-android-dropdown:before{content:"\f2de"}.ion-android-earth:before{content:"\f2df"}.ion-android-folder:before{content:"\f2e0"}.ion-android-forums:before{content:"\f2e1"}.ion-android-friends:before{content:"\f2e2"}.ion-android-hand:before{content:"\f2e3"}.ion-android-image:before{content:"\f2e4"}.ion-android-inbox:before{content:"\f2e5"}.ion-android-information:before{content:"\f2e6"}.ion-android-keypad:before{content:"\f2e7"}.ion-android-lightbulb:before{content:"\f2e8"}.ion-android-locate:before{content:"\f2e9"}.ion-android-location:before{content:"\f2ea"}.ion-android-mail:before{content:"\f2eb"}.ion-android-microphone:before{content:"\f2ec"}.ion-android-mixer:before{content:"\f2ed"}.ion-android-more:before{content:"\f2ee"}.ion-android-note:before{content:"\f2ef"}.ion-android-playstore:before{content:"\f2f0"}.ion-android-printer:before{content:"\f2f1"}.ion-android-promotion:before{content:"\f2f2"}.ion-android-reminder:before{content:"\f2f3"}.ion-android-remove:before{content:"\f2f4"}.ion-android-search:before{content:"\f2f5"}.ion-android-send:before{content:"\f2f6"}.ion-android-settings:before{content:"\f2f7"}.ion-android-share:before{content:"\f2f8"}.ion-android-social:before{content:"\f2fa"}.ion-android-social-user:before{content:"\f2f9"}.ion-android-sort:before{content:"\f2fb"}.ion-android-stair-drawer:before{content:"\f311"}.ion-android-star:before{content:"\f2fc"}.ion-android-stopwatch:before{content:"\f2fd"}.ion-android-storage:before{content:"\f2fe"}.ion-android-system-back:before{content:"\f2ff"}.ion-android-system-home:before{content:"\f300"}.ion-android-system-windows:before{content:"\f301"}.ion-android-timer:before{content:"\f302"}.ion-android-trash:before{content:"\f303"}.ion-android-user-menu:before{content:"\f312"}.ion-android-volume:before{content:"\f304"}.ion-android-wifi:before{content:"\f305"}.ion-aperture:before{content:"\f313"}.ion-archive:before{content:"\f102"}.ion-arrow-down-a:before{content:"\f103"}.ion-arrow-down-b:before{content:"\f104"}.ion-arrow-down-c:before{content:"\f105"}.ion-arrow-expand:before{content:"\f25e"}.ion-arrow-graph-down-left:before{content:"\f25f"}.ion-arrow-graph-down-right:before{content:"\f260"}.ion-arrow-graph-up-left:before{content:"\f261"}.ion-arrow-graph-up-right:before{content:"\f262"}.ion-arrow-left-a:before{content:"\f106"}.ion-arrow-left-b:before{content:"\f107"}.ion-arrow-left-c:before{content:"\f108"}.ion-arrow-move:before{content:"\f263"}.ion-arrow-resize:before{content:"\f264"}.ion-arrow-return-left:before{content:"\f265"}.ion-arrow-return-right:before{content:"\f266"}.ion-arrow-right-a:before{content:"\f109"}.ion-arrow-right-b:before{content:"\f10a"}.ion-arrow-right-c:before{content:"\f10b"}.ion-arrow-shrink:before{content:"\f267"}.ion-arrow-swap:before{content:"\f268"}.ion-arrow-up-a:before{content:"\f10c"}.ion-arrow-up-b:before{content:"\f10d"}.ion-arrow-up-c:before{content:"\f10e"}.ion-asterisk:before{content:"\f314"}.ion-at:before{content:"\f10f"}.ion-bag:before{content:"\f110"}.ion-battery-charging:before{content:"\f111"}.ion-battery-empty:before{content:"\f112"}.ion-battery-full:before{content:"\f113"}.ion-battery-half:before{content:"\f114"}.ion-battery-low:before{content:"\f115"}.ion-beaker:before{content:"\f269"}.ion-beer:before{content:"\f26a"}.ion-bluetooth:before{content:"\f116"}.ion-bonfire:before{content:"\f315"}.ion-bookmark:before{content:"\f26b"}.ion-briefcase:before{content:"\f26c"}.ion-bug:before{content:"\f2be"}.ion-calculator:before{content:"\f26d"}.ion-calendar:before{content:"\f117"}.ion-camera:before{content:"\f118"}.ion-card:before{content:"\f119"}.ion-cash:before{content:"\f316"}.ion-chatbox:before{content:"\f11b"}.ion-chatbox-working:before{content:"\f11a"}.ion-chatboxes:before{content:"\f11c"}.ion-chatbubble:before{content:"\f11e"}.ion-chatbubble-working:before{content:"\f11d"}.ion-chatbubbles:before{content:"\f11f"}.ion-checkmark:before{content:"\f122"}.ion-checkmark-circled:before{content:"\f120"}.ion-checkmark-round:before{content:"\f121"}.ion-chevron-down:before{content:"\f123"}.ion-chevron-left:before{content:"\f124"}.ion-chevron-right:before{content:"\f125"}.ion-chevron-up:before{content:"\f126"}.ion-clipboard:before{content:"\f127"}.ion-clock:before{content:"\f26e"}.ion-close:before{content:"\f12a"}.ion-close-circled:before{content:"\f128"}.ion-close-round:before{content:"\f129"}.ion-closed-captioning:before{content:"\f317"}.ion-cloud:before{content:"\f12b"}.ion-code:before{content:"\f271"}.ion-code-download:before{content:"\f26f"}.ion-code-working:before{content:"\f270"}.ion-coffee:before{content:"\f272"}.ion-compass:before{content:"\f273"}.ion-compose:before{content:"\f12c"}.ion-connection-bars:before{content:"\f274"}.ion-contrast:before{content:"\f275"}.ion-cube:before{content:"\f318"}.ion-disc:before{content:"\f12d"}.ion-document:before{content:"\f12f"}.ion-document-text:before{content:"\f12e"}.ion-drag:before{content:"\f130"}.ion-earth:before{content:"\f276"}.ion-edit:before{content:"\f2bf"}.ion-egg:before{content:"\f277"}.ion-eject:before{content:"\f131"}.ion-email:before{content:"\f132"}.ion-eye:before{content:"\f133"}.ion-eye-disabled:before{content:"\f306"}.ion-female:before{content:"\f278"}.ion-filing:before{content:"\f134"}.ion-film-marker:before{content:"\f135"}.ion-fireball:before{content:"\f319"}.ion-flag:before{content:"\f279"}.ion-flame:before{content:"\f31a"}.ion-flash:before{content:"\f137"}.ion-flash-off:before{content:"\f136"}.ion-flask:before{content:"\f138"}.ion-folder:before{content:"\f139"}.ion-fork:before{content:"\f27a"}.ion-fork-repo:before{content:"\f2c0"}.ion-forward:before{content:"\f13a"}.ion-funnel:before{content:"\f31b"}.ion-game-controller-a:before{content:"\f13b"}.ion-game-controller-b:before{content:"\f13c"}.ion-gear-a:before{content:"\f13d"}.ion-gear-b:before{content:"\f13e"}.ion-grid:before{content:"\f13f"}.ion-hammer:before{content:"\f27b"}.ion-happy:before{content:"\f31c"}.ion-headphone:before{content:"\f140"}.ion-heart:before{content:"\f141"}.ion-heart-broken:before{content:"\f31d"}.ion-help:before{content:"\f143"}.ion-help-buoy:before{content:"\f27c"}.ion-help-circled:before{content:"\f142"}.ion-home:before{content:"\f144"}.ion-icecream:before{content:"\f27d"}.ion-icon-social-google-plus:before{content:"\f146"}.ion-icon-social-google-plus-outline:before{content:"\f145"}.ion-image:before{content:"\f147"}.ion-images:before{content:"\f148"}.ion-information:before{content:"\f14a"}.ion-information-circled:before{content:"\f149"}.ion-ionic:before{content:"\f14b"}.ion-ios7-alarm:before{content:"\f14d"}.ion-ios7-alarm-outline:before{content:"\f14c"}.ion-ios7-albums:before{content:"\f14f"}.ion-ios7-albums-outline:before{content:"\f14e"}.ion-ios7-americanfootball:before{content:"\f31f"}.ion-ios7-americanfootball-outline:before{content:"\f31e"}.ion-ios7-analytics:before{content:"\f321"}.ion-ios7-analytics-outline:before{content:"\f320"}.ion-ios7-arrow-back:before{content:"\f150"}.ion-ios7-arrow-down:before{content:"\f151"}.ion-ios7-arrow-forward:before{content:"\f152"}.ion-ios7-arrow-left:before{content:"\f153"}.ion-ios7-arrow-right:before{content:"\f154"}.ion-ios7-arrow-thin-down:before{content:"\f27e"}.ion-ios7-arrow-thin-left:before{content:"\f27f"}.ion-ios7-arrow-thin-right:before{content:"\f280"}.ion-ios7-arrow-thin-up:before{content:"\f281"}.ion-ios7-arrow-up:before{content:"\f155"}.ion-ios7-at:before{content:"\f157"}.ion-ios7-at-outline:before{content:"\f156"}.ion-ios7-barcode:before{content:"\f323"}.ion-ios7-barcode-outline:before{content:"\f322"}.ion-ios7-baseball:before{content:"\f325"}.ion-ios7-baseball-outline:before{content:"\f324"}.ion-ios7-basketball:before{content:"\f327"}.ion-ios7-basketball-outline:before{content:"\f326"}.ion-ios7-bell:before{content:"\f159"}.ion-ios7-bell-outline:before{content:"\f158"}.ion-ios7-bolt:before{content:"\f15b"}.ion-ios7-bolt-outline:before{content:"\f15a"}.ion-ios7-bookmarks:before{content:"\f15d"}.ion-ios7-bookmarks-outline:before{content:"\f15c"}.ion-ios7-box:before{content:"\f15f"}.ion-ios7-box-outline:before{content:"\f15e"}.ion-ios7-briefcase:before{content:"\f283"}.ion-ios7-briefcase-outline:before{content:"\f282"}.ion-ios7-browsers:before{content:"\f161"}.ion-ios7-browsers-outline:before{content:"\f160"}.ion-ios7-calculator:before{content:"\f285"}.ion-ios7-calculator-outline:before{content:"\f284"}.ion-ios7-calendar:before{content:"\f163"}.ion-ios7-calendar-outline:before{content:"\f162"}.ion-ios7-camera:before{content:"\f165"}.ion-ios7-camera-outline:before{content:"\f164"}.ion-ios7-cart:before{content:"\f167"}.ion-ios7-cart-outline:before{content:"\f166"}.ion-ios7-chatboxes:before{content:"\f169"}.ion-ios7-chatboxes-outline:before{content:"\f168"}.ion-ios7-chatbubble:before{content:"\f16b"}.ion-ios7-chatbubble-outline:before{content:"\f16a"}.ion-ios7-checkmark:before{content:"\f16e"}.ion-ios7-checkmark-empty:before{content:"\f16c"}.ion-ios7-checkmark-outline:before{content:"\f16d"}.ion-ios7-circle-filled:before{content:"\f16f"}.ion-ios7-circle-outline:before{content:"\f170"}.ion-ios7-clock:before{content:"\f172"}.ion-ios7-clock-outline:before{content:"\f171"}.ion-ios7-close:before{content:"\f2bc"}.ion-ios7-close-empty:before{content:"\f2bd"}.ion-ios7-close-outline:before{content:"\f2bb"}.ion-ios7-cloud:before{content:"\f178"}.ion-ios7-cloud-download:before{content:"\f174"}.ion-ios7-cloud-download-outline:before{content:"\f173"}.ion-ios7-cloud-outline:before{content:"\f175"}.ion-ios7-cloud-upload:before{content:"\f177"}.ion-ios7-cloud-upload-outline:before{content:"\f176"}.ion-ios7-cloudy:before{content:"\f17a"}.ion-ios7-cloudy-night:before{content:"\f308"}.ion-ios7-cloudy-night-outline:before{content:"\f307"}.ion-ios7-cloudy-outline:before{content:"\f179"}.ion-ios7-cog:before{content:"\f17c"}.ion-ios7-cog-outline:before{content:"\f17b"}.ion-ios7-compose:before{content:"\f17e"}.ion-ios7-compose-outline:before{content:"\f17d"}.ion-ios7-contact:before{content:"\f180"}.ion-ios7-contact-outline:before{content:"\f17f"}.ion-ios7-copy:before{content:"\f182"}.ion-ios7-copy-outline:before{content:"\f181"}.ion-ios7-download:before{content:"\f184"}.ion-ios7-download-outline:before{content:"\f183"}.ion-ios7-drag:before{content:"\f185"}.ion-ios7-email:before{content:"\f187"}.ion-ios7-email-outline:before{content:"\f186"}.ion-ios7-expand:before{content:"\f30d"}.ion-ios7-eye:before{content:"\f189"}.ion-ios7-eye-outline:before{content:"\f188"}.ion-ios7-fastforward:before{content:"\f18b"}.ion-ios7-fastforward-outline:before{content:"\f18a"}.ion-ios7-filing:before{content:"\f18d"}.ion-ios7-filing-outline:before{content:"\f18c"}.ion-ios7-film:before{content:"\f18f"}.ion-ios7-film-outline:before{content:"\f18e"}.ion-ios7-flag:before{content:"\f191"}.ion-ios7-flag-outline:before{content:"\f190"}.ion-ios7-folder:before{content:"\f193"}.ion-ios7-folder-outline:before{content:"\f192"}.ion-ios7-football:before{content:"\f329"}.ion-ios7-football-outline:before{content:"\f328"}.ion-ios7-gear:before{content:"\f195"}.ion-ios7-gear-outline:before{content:"\f194"}.ion-ios7-glasses:before{content:"\f197"}.ion-ios7-glasses-outline:before{content:"\f196"}.ion-ios7-heart:before{content:"\f199"}.ion-ios7-heart-outline:before{content:"\f198"}.ion-ios7-help:before{content:"\f19c"}.ion-ios7-help-empty:before{content:"\f19a"}.ion-ios7-help-outline:before{content:"\f19b"}.ion-ios7-home:before{content:"\f32b"}.ion-ios7-home-outline:before{content:"\f32a"}.ion-ios7-infinite:before{content:"\f19e"}.ion-ios7-infinite-outline:before{content:"\f19d"}.ion-ios7-information:before{content:"\f1a1"}.ion-ios7-information-empty:before{content:"\f19f"}.ion-ios7-information-outline:before{content:"\f1a0"}.ion-ios7-ionic-outline:before{content:"\f1a2"}.ion-ios7-keypad:before{content:"\f1a4"}.ion-ios7-keypad-outline:before{content:"\f1a3"}.ion-ios7-lightbulb:before{content:"\f287"}.ion-ios7-lightbulb-outline:before{content:"\f286"}.ion-ios7-location:before{content:"\f1a6"}.ion-ios7-location-outline:before{content:"\f1a5"}.ion-ios7-locked:before{content:"\f1a8"}.ion-ios7-locked-outline:before{content:"\f1a7"}.ion-ios7-loop:before{content:"\f32d"}.ion-ios7-loop-strong:before{content:"\f32c"}.ion-ios7-medkit:before{content:"\f289"}.ion-ios7-medkit-outline:before{content:"\f288"}.ion-ios7-mic:before{content:"\f1ab"}.ion-ios7-mic-off:before{content:"\f1a9"}.ion-ios7-mic-outline:before{content:"\f1aa"}.ion-ios7-minus:before{content:"\f1ae"}.ion-ios7-minus-empty:before{content:"\f1ac"}.ion-ios7-minus-outline:before{content:"\f1ad"}.ion-ios7-monitor:before{content:"\f1b0"}.ion-ios7-monitor-outline:before{content:"\f1af"}.ion-ios7-moon:before{content:"\f1b2"}.ion-ios7-moon-outline:before{content:"\f1b1"}.ion-ios7-more:before{content:"\f1b4"}.ion-ios7-more-outline:before{content:"\f1b3"}.ion-ios7-musical-note:before{content:"\f1b5"}.ion-ios7-musical-notes:before{content:"\f1b6"}.ion-ios7-navigate:before{content:"\f1b8"}.ion-ios7-navigate-outline:before{content:"\f1b7"}.ion-ios7-paper:before{content:"\f32f"}.ion-ios7-paper-outline:before{content:"\f32e"}.ion-ios7-paperplane:before{content:"\f1ba"}.ion-ios7-paperplane-outline:before{content:"\f1b9"}.ion-ios7-partlysunny:before{content:"\f1bc"}.ion-ios7-partlysunny-outline:before{content:"\f1bb"}.ion-ios7-pause:before{content:"\f1be"}.ion-ios7-pause-outline:before{content:"\f1bd"}.ion-ios7-paw:before{content:"\f331"}.ion-ios7-paw-outline:before{content:"\f330"}.ion-ios7-people:before{content:"\f1c0"}.ion-ios7-people-outline:before{content:"\f1bf"}.ion-ios7-person:before{content:"\f1c2"}.ion-ios7-person-outline:before{content:"\f1c1"}.ion-ios7-personadd:before{content:"\f1c4"}.ion-ios7-personadd-outline:before{content:"\f1c3"}.ion-ios7-photos:before{content:"\f1c6"}.ion-ios7-photos-outline:before{content:"\f1c5"}.ion-ios7-pie:before{content:"\f28b"}.ion-ios7-pie-outline:before{content:"\f28a"}.ion-ios7-play:before{content:"\f1c8"}.ion-ios7-play-outline:before{content:"\f1c7"}.ion-ios7-plus:before{content:"\f1cb"}.ion-ios7-plus-empty:before{content:"\f1c9"}.ion-ios7-plus-outline:before{content:"\f1ca"}.ion-ios7-pricetag:before{content:"\f28d"}.ion-ios7-pricetag-outline:before{content:"\f28c"}.ion-ios7-pricetags:before{content:"\f333"}.ion-ios7-pricetags-outline:before{content:"\f332"}.ion-ios7-printer:before{content:"\f1cd"}.ion-ios7-printer-outline:before{content:"\f1cc"}.ion-ios7-pulse:before{content:"\f335"}.ion-ios7-pulse-strong:before{content:"\f334"}.ion-ios7-rainy:before{content:"\f1cf"}.ion-ios7-rainy-outline:before{content:"\f1ce"}.ion-ios7-recording:before{content:"\f1d1"}.ion-ios7-recording-outline:before{content:"\f1d0"}.ion-ios7-redo:before{content:"\f1d3"}.ion-ios7-redo-outline:before{content:"\f1d2"}.ion-ios7-refresh:before{content:"\f1d6"}.ion-ios7-refresh-empty:before{content:"\f1d4"}.ion-ios7-refresh-outline:before{content:"\f1d5"}.ion-ios7-reload:before,.ion-ios7-reloading:before{content:"\f28e"}.ion-ios7-reverse-camera:before{content:"\f337"}.ion-ios7-reverse-camera-outline:before{content:"\f336"}.ion-ios7-rewind:before{content:"\f1d8"}.ion-ios7-rewind-outline:before{content:"\f1d7"}.ion-ios7-search:before{content:"\f1da"}.ion-ios7-search-strong:before{content:"\f1d9"}.ion-ios7-settings:before{content:"\f339"}.ion-ios7-settings-strong:before{content:"\f338"}.ion-ios7-shrink:before{content:"\f30e"}.ion-ios7-skipbackward:before{content:"\f1dc"}.ion-ios7-skipbackward-outline:before{content:"\f1db"}.ion-ios7-skipforward:before{content:"\f1de"}.ion-ios7-skipforward-outline:before{content:"\f1dd"}.ion-ios7-snowy:before{content:"\f309"}.ion-ios7-speedometer:before{content:"\f290"}.ion-ios7-speedometer-outline:before{content:"\f28f"}.ion-ios7-star:before{content:"\f1e0"}.ion-ios7-star-half:before{content:"\f33a"}.ion-ios7-star-outline:before{content:"\f1df"}.ion-ios7-stopwatch:before{content:"\f1e2"}.ion-ios7-stopwatch-outline:before{content:"\f1e1"}.ion-ios7-sunny:before{content:"\f1e4"}.ion-ios7-sunny-outline:before{content:"\f1e3"}.ion-ios7-telephone:before{content:"\f1e6"}.ion-ios7-telephone-outline:before{content:"\f1e5"}.ion-ios7-tennisball:before{content:"\f33c"}.ion-ios7-tennisball-outline:before{content:"\f33b"}.ion-ios7-thunderstorm:before{content:"\f1e8"}.ion-ios7-thunderstorm-outline:before{content:"\f1e7"}.ion-ios7-time:before{content:"\f292"}.ion-ios7-time-outline:before{content:"\f291"}.ion-ios7-timer:before{content:"\f1ea"}.ion-ios7-timer-outline:before{content:"\f1e9"}.ion-ios7-toggle:before{content:"\f33e"}.ion-ios7-toggle-outline:before{content:"\f33d"}.ion-ios7-trash:before{content:"\f1ec"}.ion-ios7-trash-outline:before{content:"\f1eb"}.ion-ios7-undo:before{content:"\f1ee"}.ion-ios7-undo-outline:before{content:"\f1ed"}.ion-ios7-unlocked:before{content:"\f1f0"}.ion-ios7-unlocked-outline:before{content:"\f1ef"}.ion-ios7-upload:before{content:"\f1f2"}.ion-ios7-upload-outline:before{content:"\f1f1"}.ion-ios7-videocam:before{content:"\f1f4"}.ion-ios7-videocam-outline:before{content:"\f1f3"}.ion-ios7-volume-high:before{content:"\f1f5"}.ion-ios7-volume-low:before{content:"\f1f6"}.ion-ios7-wineglass:before{content:"\f294"}.ion-ios7-wineglass-outline:before{content:"\f293"}.ion-ios7-world:before{content:"\f1f8"}.ion-ios7-world-outline:before{content:"\f1f7"}.ion-ipad:before{content:"\f1f9"}.ion-iphone:before{content:"\f1fa"}.ion-ipod:before{content:"\f1fb"}.ion-jet:before{content:"\f295"}.ion-key:before{content:"\f296"}.ion-knife:before{content:"\f297"}.ion-laptop:before{content:"\f1fc"}.ion-leaf:before{content:"\f1fd"}.ion-levels:before{content:"\f298"}.ion-lightbulb:before{content:"\f299"}.ion-link:before{content:"\f1fe"}.ion-load-a:before,.ion-loading-a:before{content:"\f29a"}.ion-load-b:before,.ion-loading-b:before{content:"\f29b"}.ion-load-c:before,.ion-loading-c:before{content:"\f29c"}.ion-load-d:before,.ion-loading-d:before{content:"\f29d"}.ion-location:before{content:"\f1ff"}.ion-locked:before{content:"\f200"}.ion-log-in:before{content:"\f29e"}.ion-log-out:before{content:"\f29f"}.ion-loop:before,.ion-looping:before{content:"\f201"}.ion-magnet:before{content:"\f2a0"}.ion-male:before{content:"\f2a1"}.ion-man:before{content:"\f202"}.ion-map:before{content:"\f203"}.ion-medkit:before{content:"\f2a2"}.ion-merge:before{content:"\f33f"}.ion-mic-a:before{content:"\f204"}.ion-mic-b:before{content:"\f205"}.ion-mic-c:before{content:"\f206"}.ion-minus:before{content:"\f209"}.ion-minus-circled:before{content:"\f207"}.ion-minus-round:before{content:"\f208"}.ion-model-s:before{content:"\f2c1"}.ion-monitor:before{content:"\f20a"}.ion-more:before{content:"\f20b"}.ion-mouse:before{content:"\f340"}.ion-music-note:before{content:"\f20c"}.ion-navicon:before{content:"\f20e"}.ion-navicon-round:before{content:"\f20d"}.ion-navigate:before{content:"\f2a3"}.ion-network:before{content:"\f341"}.ion-no-smoking:before{content:"\f2c2"}.ion-nuclear:before{content:"\f2a4"}.ion-outlet:before{content:"\f342"}.ion-paper-airplane:before{content:"\f2c3"}.ion-paperclip:before{content:"\f20f"}.ion-pause:before{content:"\f210"}.ion-person:before{content:"\f213"}.ion-person-add:before{content:"\f211"}.ion-person-stalker:before{content:"\f212"}.ion-pie-graph:before{content:"\f2a5"}.ion-pin:before{content:"\f2a6"}.ion-pinpoint:before{content:"\f2a7"}.ion-pizza:before{content:"\f2a8"}.ion-plane:before{content:"\f214"}.ion-planet:before{content:"\f343"}.ion-play:before{content:"\f215"}.ion-playstation:before{content:"\f30a"}.ion-plus:before{content:"\f218"}.ion-plus-circled:before{content:"\f216"}.ion-plus-round:before{content:"\f217"}.ion-podium:before{content:"\f344"}.ion-pound:before{content:"\f219"}.ion-power:before{content:"\f2a9"}.ion-pricetag:before{content:"\f2aa"}.ion-pricetags:before{content:"\f2ab"}.ion-printer:before{content:"\f21a"}.ion-pull-request:before{content:"\f345"}.ion-qr-scanner:before{content:"\f346"}.ion-quote:before{content:"\f347"}.ion-radio-waves:before{content:"\f2ac"}.ion-record:before{content:"\f21b"}.ion-refresh:before,.ion-refreshing:before{content:"\f21c"}.ion-reply:before{content:"\f21e"}.ion-reply-all:before{content:"\f21d"}.ion-ribbon-a:before{content:"\f348"}.ion-ribbon-b:before{content:"\f349"}.ion-sad:before{content:"\f34a"}.ion-scissors:before{content:"\f34b"}.ion-search:before{content:"\f21f"}.ion-settings:before{content:"\f2ad"}.ion-share:before{content:"\f220"}.ion-shuffle:before{content:"\f221"}.ion-skip-backward:before{content:"\f222"}.ion-skip-forward:before{content:"\f223"}.ion-social-android:before{content:"\f225"}.ion-social-android-outline:before{content:"\f224"}.ion-social-apple:before{content:"\f227"}.ion-social-apple-outline:before{content:"\f226"}.ion-social-bitcoin:before{content:"\f2af"}.ion-social-bitcoin-outline:before{content:"\f2ae"}.ion-social-buffer:before{content:"\f229"}.ion-social-buffer-outline:before{content:"\f228"}.ion-social-designernews:before{content:"\f22b"}.ion-social-designernews-outline:before{content:"\f22a"}.ion-social-dribbble:before{content:"\f22d"}.ion-social-dribbble-outline:before{content:"\f22c"}.ion-social-dropbox:before{content:"\f22f"}.ion-social-dropbox-outline:before{content:"\f22e"}.ion-social-facebook:before{content:"\f231"}.ion-social-facebook-outline:before{content:"\f230"}.ion-social-foursquare:before{content:"\f34d"}.ion-social-foursquare-outline:before{content:"\f34c"}.ion-social-freebsd-devil:before{content:"\f2c4"}.ion-social-github:before{content:"\f233"}.ion-social-github-outline:before{content:"\f232"}.ion-social-google:before{content:"\f34f"}.ion-social-google-outline:before{content:"\f34e"}.ion-social-googleplus:before{content:"\f235"}.ion-social-googleplus-outline:before{content:"\f234"}.ion-social-hackernews:before{content:"\f237"}.ion-social-hackernews-outline:before{content:"\f236"}.ion-social-instagram:before{content:"\f351"}.ion-social-instagram-outline:before{content:"\f350"}.ion-social-linkedin:before{content:"\f239"}.ion-social-linkedin-outline:before{content:"\f238"}.ion-social-pinterest:before{content:"\f2b1"}.ion-social-pinterest-outline:before{content:"\f2b0"}.ion-social-reddit:before{content:"\f23b"}.ion-social-reddit-outline:before{content:"\f23a"}.ion-social-rss:before{content:"\f23d"}.ion-social-rss-outline:before{content:"\f23c"}.ion-social-skype:before{content:"\f23f"}.ion-social-skype-outline:before{content:"\f23e"}.ion-social-tumblr:before{content:"\f241"}.ion-social-tumblr-outline:before{content:"\f240"}.ion-social-tux:before{content:"\f2c5"}.ion-social-twitter:before{content:"\f243"}.ion-social-twitter-outline:before{content:"\f242"}.ion-social-usd:before{content:"\f353"}.ion-social-usd-outline:before{content:"\f352"}.ion-social-vimeo:before{content:"\f245"}.ion-social-vimeo-outline:before{content:"\f244"}.ion-social-windows:before{content:"\f247"}.ion-social-windows-outline:before{content:"\f246"}.ion-social-wordpress:before{content:"\f249"}.ion-social-wordpress-outline:before{content:"\f248"}.ion-social-yahoo:before{content:"\f24b"}.ion-social-yahoo-outline:before{content:"\f24a"}.ion-social-youtube:before{content:"\f24d"}.ion-social-youtube-outline:before{content:"\f24c"}.ion-speakerphone:before{content:"\f2b2"}.ion-speedometer:before{content:"\f2b3"}.ion-spoon:before{content:"\f2b4"}.ion-star:before{content:"\f24e"}.ion-stats-bars:before{content:"\f2b5"}.ion-steam:before{content:"\f30b"}.ion-stop:before{content:"\f24f"}.ion-thermometer:before{content:"\f2b6"}.ion-thumbsdown:before{content:"\f250"}.ion-thumbsup:before{content:"\f251"}.ion-toggle:before{content:"\f355"}.ion-toggle-filled:before{content:"\f354"}.ion-trash-a:before{content:"\f252"}.ion-trash-b:before{content:"\f253"}.ion-trophy:before{content:"\f356"}.ion-umbrella:before{content:"\f2b7"}.ion-university:before{content:"\f357"}.ion-unlocked:before{content:"\f254"}.ion-upload:before{content:"\f255"}.ion-usb:before{content:"\f2b8"}.ion-videocamera:before{content:"\f256"}.ion-volume-high:before{content:"\f257"}.ion-volume-low:before{content:"\f258"}.ion-volume-medium:before{content:"\f259"}.ion-volume-mute:before{content:"\f25a"}.ion-wand:before{content:"\f358"}.ion-waterdrop:before{content:"\f25b"}.ion-wifi:before{content:"\f25c"}.ion-wineglass:before{content:"\f2b9"}.ion-woman:before{content:"\f25d"}.ion-wrench:before{content:"\f2ba"}.ion-xbox:before{content:"\f30c"}a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{margin:0;padding:0;border:0;vertical-align:baseline;font:inherit;font-size:100%}ol,ul{list-style:none}blockquote,q{quotes:none}audio:not([controls]){display:none;height:0}[hidden],template{display:none}script{display:none!important}html{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}:focus,a,a:active,a:focus,a:hover,button,button:focus{outline:0}a{-webkit-user-drag:none;-webkit-tap-highlight-color:transparent}a[href]:hover{cursor:pointer}b,strong{font-weight:700}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}code,kbd,pre,samp{font-size:1em;font-family:monospace,serif}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}sub,sup{position:relative;vertical-align:baseline;font-size:75%;line-height:0}sup{top:-.5em}sub{bottom:-.25em}fieldset{margin:0 2px;padding:.35em .625em .75em;border:1px solid silver}button,input,select,textarea{margin:0;outline-offset:0;outline-style:none;outline-width:0;-webkit-font-smoothing:inherit;background-image:none}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto}img{-webkit-user-drag:none}table{border-spacing:0;border-collapse:collapse}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{overflow:hidden;-ms-touch-action:pan-y;touch-action:pan-y}.ionic-body,body{-webkit-touch-callout:none;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;-webkit-tap-highlight-color:transparent;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;top:0;right:0;bottom:0;left:0;overflow:hidden;margin:0;padding:0;color:#000;word-wrap:break-word;font-size:14px;font-family:"Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;line-height:20px;text-rendering:optimizeLegibility;-webkit-backface-visibility:hidden;-webkit-user-drag:none}body.grade-b,body.grade-c{text-rendering:auto}.content{position:relative}.scroll-content{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden;margin-top:-1px;width:auto;height:auto}.menu .scroll-content.scroll-content-false,.scroll-content-false{z-index:11}.scroll-view{position:relative;display:block;overflow:hidden;margin-top:-1px}.scroll{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;-webkit-transform-origin:left top;-moz-transform-origin:left top;transform-origin:left top}::-webkit-scrollbar{display:none}.scroll-bar{position:absolute;z-index:9999}.ng-animate .scroll-bar{visibility:hidden}.scroll-bar-h{right:2px;bottom:3px;left:2px;height:3px}.scroll-bar-h .scroll-bar-indicator{height:100%}.scroll-bar-v{top:2px;right:3px;bottom:2px;width:3px}.scroll-bar-v .scroll-bar-indicator{width:100%}.scroll-bar-indicator{position:absolute;border-radius:4px;background:rgba(0,0,0,.3);opacity:1}.scroll-bar-indicator.scroll-bar-fade-out{-webkit-transition:opacity .3s linear;-moz-transition:opacity .3s linear;transition:opacity .3s linear;opacity:0}.grade-b .scroll-bar-indicator,.grade-c .scroll-bar-indicator{border-radius:0;background:#aaa}.grade-b .scroll-bar-indicator.scroll-bar-fade-out,.grade-c .scroll-bar-indicator.scroll-bar-fade-out{-webkit-transition:none;-moz-transition:none;transition:none}@keyframes refresh-spin{0%{transform:translate3d(0,0,0) rotate(0)}100%{transform:translate3d(0,0,0) rotate(-180deg)}}@-webkit-keyframes refresh-spin{0%{-webkit-transform:translate3d(0,0,0) rotate(0)}100%{-webkit-transform:translate3d(0,0,0) rotate(-180deg)}}@keyframes refresh-spin-back{0%{transform:translate3d(0,0,0) rotate(-180deg)}100%{transform:translate3d(0,0,0) rotate(0)}}@-webkit-keyframes refresh-spin-back{0%{-webkit-transform:translate3d(0,0,0) rotate(-180deg)}100%{-webkit-transform:translate3d(0,0,0) rotate(0)}}.scroll-refresher{position:absolute;top:-60px;right:0;left:0;overflow:hidden;margin:auto;height:60px}.scroll-refresher .ionic-refresher-content{position:absolute;bottom:15px;left:0;width:100%;color:#666;text-align:center;font-size:30px}.scroll-refresher .ionic-refresher-content .text-pulling,.scroll-refresher .ionic-refresher-content .text-refreshing{font-size:16px;line-height:16px}.scroll-refresher .ionic-refresher-content.ionic-refresher-with-text{bottom:10px}.scroll-refresher .icon-pulling,.scroll-refresher .icon-refreshing{width:100%;-webkit-backface-visibility:hidden;-webkit-transform-style:preserve-3d;backface-visibility:hidden;transform-style:preserve-3d}.scroll-refresher .icon-pulling{-webkit-animation-name:refresh-spin-back;-moz-animation-name:refresh-spin-back;animation-name:refresh-spin-back;-webkit-animation-duration:200ms;-moz-animation-duration:200ms;animation-duration:200ms;-webkit-animation-timing-function:linear;-moz-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-fill-mode:none;-moz-animation-fill-mode:none;animation-fill-mode:none;-webkit-transform:translate3d(0,0,0) rotate(0deg);transform:translate3d(0,0,0) rotate(0deg)}.scroll-refresher .icon-refreshing,.scroll-refresher .text-refreshing{display:none}.scroll-refresher .icon-refreshing{-webkit-animation-duration:1.5s;-moz-animation-duration:1.5s;animation-duration:1.5s}.scroll-refresher.active .icon-pulling{-webkit-animation-name:refresh-spin;-moz-animation-name:refresh-spin;animation-name:refresh-spin;-webkit-transform:translate3d(0,0,0) rotate(-180deg);transform:translate3d(0,0,0) rotate(-180deg)}.scroll-refresher.active.refreshing .icon-pulling,.scroll-refresher.active.refreshing .text-pulling{display:none}.scroll-refresher.active.refreshing .icon-refreshing,.scroll-refresher.active.refreshing .text-refreshing{display:block}ion-infinite-scroll{height:60px;width:100%;opacity:0;-webkit-transition:opacity .25s;-moz-transition:opacity .25s;transition:opacity .25s;display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-direction:normal;-webkit-box-orient:horizontal;-webkit-flex-direction:row;-moz-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;-moz-justify-content:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center}ion-infinite-scroll .icon{font-size:30px;color:#666}ion-infinite-scroll.active{opacity:1}.overflow-scroll{overflow-x:hidden;overflow-y:scroll;-webkit-overflow-scrolling:touch}.overflow-scroll .scroll{position:static;height:100%;-webkit-transform:translate3d(0,0,0)}.has-header{top:44px}.no-header{top:0}.has-subheader{top:88px}.has-tabs-top{top:93px}.has-header.has-subheader.has-tabs-top{top:137px}.has-footer{bottom:44px}.has-subfooter{bottom:88px}.bar-footer.has-tabs,.has-tabs{bottom:49px}.has-footer.has-tabs{bottom:93px}.pane{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);z-index:1}.view{z-index:1}.pane,.view{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;background-color:#fff;overflow:hidden}p{margin:0 0 10px}small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:#000;font-weight:500;font-family:"Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;line-height:1.2}.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:400;line-height:1}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1:first-child,.h2:first-child,.h3:first-child,h1:first-child,h2:first-child,h3:first-child{margin-top:0}.h1+.h1,.h1+.h2,.h1+.h3,.h1+h1,.h1+h2,.h1+h3,.h2+.h1,.h2+.h2,.h2+.h3,.h2+h1,.h2+h2,.h2+h3,.h3+.h1,.h3+.h2,.h3+.h3,.h3+h1,.h3+h2,.h3+h3,h1+.h1,h1+.h2,h1+.h3,h1+h1,h1+h2,h1+h3,h2+.h1,h2+.h2,h2+.h3,h2+h1,h2+h2,h2+h3,h3+.h1,h3+.h2,h3+.h3,h3+h1,h3+h2,h3+h3{margin-top:10px}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}.h1 small,h1 small{font-size:24px}.h2 small,h2 small{font-size:18px}.h3 small,.h4 small,h3 small,h4 small{font-size:14px}dl{margin-bottom:20px}dd,dt{line-height:1.42857}dt{font-weight:700}blockquote{margin:0 0 20px;padding:10px 20px;border-left:5px solid gray}blockquote p{font-weight:300;font-size:17.5px;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small{display:block;line-height:1.42857}blockquote small:before{content:'\2014 \00A0'}blockquote:after,blockquote:before,q:after,q:before{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:1.42857}a.subdued{padding-right:10px;color:#888;text-decoration:none}a.subdued:hover{text-decoration:none}a.subdued:last-child{padding-right:0}.action-sheet-backdrop{-webkit-transition:background-color 300ms ease-in-out;-moz-transition:background-color 300ms ease-in-out;transition:background-color 300ms ease-in-out;position:fixed;top:0;left:0;z-index:11;width:100%;height:100%;background-color:transparent}.action-sheet-backdrop.active{background-color:rgba(0,0,0,.5)}.action-sheet-wrapper{-webkit-transform:translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);-webkit-transition:all ease-in-out 300ms;-moz-transition:all ease-in-out 300ms;transition:all ease-in-out 300ms;position:absolute;bottom:0;width:100%}.action-sheet-up{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.action-sheet{margin-left:15px;margin-right:15px;width:auto;z-index:11;overflow:hidden}.action-sheet .button{display:block;padding:1px;width:100%;border-radius:0;background-color:transparent;color:#4a87ee;font-size:18px}.action-sheet .button.destructive{color:#ef4e3a}.action-sheet-title{padding:10px;color:#666;text-align:center;font-size:12px}.action-sheet-group{margin-bottom:5px;border-radius:3px;background-color:#fff}.action-sheet-group .button{border-width:1px 0 0;border-radius:0}.action-sheet-group .button.active{background-color:transparent;color:inherit}.action-sheet-group .button:first-child:last-child{border-width:0}.action-sheet-open,.action-sheet-open.modal-open .modal{pointer-events:none}.action-sheet-open .action-sheet-backdrop{pointer-events:auto}.backdrop{position:fixed;top:0;left:0;z-index:11;width:100%;height:100%;background-color:rgba(0,0,0,.4);visibility:hidden;opacity:0;-webkit-transition:.1s opacity linear;-moz-transition:.1s opacity linear;transition:.1s opacity linear}.backdrop.visible{visibility:visible}.backdrop.active{opacity:1}.bar{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:absolute;right:0;left:0;z-index:10;box-sizing:border-box;padding:5px;width:100%;height:44px;border-width:0;border-style:solid;border-top:1px solid transparent;border-bottom:1px solid #ddd;background-color:#fff;background-size:0}@media (min--moz-device-pixel-ratio:1.5),(-webkit-min-device-pixel-ratio:1.5),(min-device-pixel-ratio:1.5),(min-resolution:144dpi),(min-resolution:1.5dppx){.bar{border:none;background-image:linear-gradient(0deg,#ddd,#ddd 50%,transparent 50%);background-position:bottom;background-size:100% 1px;background-repeat:no-repeat}}.bar.bar-clear{border:none;background:0 0;color:#fff}.bar.bar-clear .button,.bar.bar-clear .title{color:#fff}.bar.item-input-inset .item-input-wrapper{margin-top:-1px}.bar.item-input-inset .item-input-wrapper input{padding-left:8px;width:94%;height:28px;background:0 0}.bar.bar-light{border-color:#ddd;background-color:#fff;background-image:linear-gradient(0deg,#ddd,#ddd 50%,transparent 50%);color:#444}.bar.bar-light .title{color:#444}.bar.bar-light.bar-footer{background-image:linear-gradient(180deg,#ddd,#ddd 50%,transparent 50%)}.bar.bar-stable{border-color:#b2b2b2;background-color:#f8f8f8;background-image:linear-gradient(0deg,#b2b2b2,#b2b2b2 50%,transparent 50%);color:#444}.bar.bar-stable .title{color:#444}.bar.bar-stable.bar-footer{background-image:linear-gradient(180deg,#b2b2b2,#b2b2b2 50%,transparent 50%)}.bar.bar-positive{border-color:#145fd7;background-color:#4a87ee;background-image:linear-gradient(0deg,#145fd7,#145fd7 50%,transparent 50%);color:#fff}.bar.bar-positive .title{color:#fff}.bar.bar-positive.bar-footer{background-image:linear-gradient(180deg,#145fd7,#145fd7 50%,transparent 50%)}.bar.bar-calm{border-color:#1aacc3;background-color:#43cee6;background-image:linear-gradient(0deg,#1aacc3,#1aacc3 50%,transparent 50%);color:#fff}.bar.bar-calm .title{color:#fff}.bar.bar-calm.bar-footer{background-image:linear-gradient(180deg,#1aacc3,#1aacc3 50%,transparent 50%)}.bar.bar-assertive{border-color:#cc2311;background-color:#ef4e3a;background-image:linear-gradient(0deg,#cc2311,#cc2311 50%,transparent 50%);color:#fff}.bar.bar-assertive .title{color:#fff}.bar.bar-assertive.bar-footer{background-image:linear-gradient(180deg,#cc2311,#cc2311 50%,transparent 50%)}.bar.bar-balanced{border-color:#498f24;background-color:#6c3;background-image:linear-gradient(0deg,#498f24,#498f24 50%,transparent 50%);color:#fff}.bar.bar-balanced .title{color:#fff}.bar.bar-balanced.bar-footer{background-image:linear-gradient(180deg,#498f24,#145fd7 50%,transparent 50%)}.bar.bar-energized{border-color:#d39211;background-color:#f0b840;background-image:linear-gradient(0deg,#d39211,#d39211 50%,transparent 50%);color:#fff}.bar.bar-energized .title{color:#fff}.bar.bar-energized.bar-footer{background-image:linear-gradient(180deg,#d39211,#d39211 50%,transparent 50%)}.bar.bar-royal{border-color:#552bdf;background-color:#8a6de9;background-image:linear-gradient(0deg,#552bdf,#552bdf 50%,transparent 50%);color:#fff}.bar.bar-royal .title{color:#fff}.bar.bar-royal.bar-footer{background-image:linear-gradient(180deg,#552bdf,#552bdf 50%,transparent 50%)}.bar.bar-dark{border-color:#111;background-color:#444;background-image:linear-gradient(0deg,#111,#111 50%,transparent 50%);color:#fff}.bar.bar-dark .title{color:#fff}.bar.bar-dark.bar-footer{background-image:linear-gradient(180deg,#111,#111 50%,transparent 50%)}.bar .title{position:absolute;top:0;right:0;left:0;z-index:0;overflow:hidden;margin:0 10px;min-width:30px;height:43px;text-align:center;text-overflow:ellipsis;white-space:nowrap;font-size:17px;line-height:44px}.bar .title.title-left{text-align:left}.bar .title.title-right{text-align:right}.bar .title a{color:inherit}.bar .button{z-index:1;padding:0 8px;min-width:initial;min-height:31px;font-weight:400;font-size:13px;line-height:32px}.bar .button .icon:before,.bar .button.button-icon:before,.bar .button.icon-left:before,.bar .button.icon-right:before,.bar .button.icon:before{padding-right:2px;padding-left:2px;font-size:20px;line-height:32px}.bar .button.button-icon{font-size:17px}.bar .button.button-icon .icon:before,.bar .button.button-icon.icon-left:before,.bar .button.button-icon.icon-right:before,.bar .button.button-icon:before{vertical-align:top;font-size:32px;line-height:32px}.bar .button.button-clear{padding-right:2px;padding-left:2px;font-weight:300;font-size:17px}.bar .button.button-clear .icon:before,.bar .button.button-clear.icon-left:before,.bar .button.button-clear.icon-right:before,.bar .button.button-clear.icon:before{font-size:32px;line-height:32px}.bar .button.back-button{padding:0;opacity:.8}.bar .button.back-button .back-button-title{display:inline-block;vertical-align:middle;margin-left:4px}.bar .button.back-button.activated,.bar .button.back-button.active{opacity:1}.bar .button-bar>.button,.bar .buttons>.button{min-height:31px;line-height:32px}.bar .button+.button-bar,.bar .button-bar+.button{margin-left:5px}.bar .buttons,.bar .buttons.left-buttons,.bar .buttons.right-buttons{display:inherit}.bar .buttons span{display:inline-flex}.bar .buttons.pull-right,.bar .title+.button:last-child,.bar .title+.buttons,.bar>.button+.button:last-child,.bar>.button.pull-right{position:absolute;top:5px;right:5px;bottom:5px}.bar-light .button{border-color:#ddd;background-color:#fff;color:#444}.bar-light .button:hover{color:#444;text-decoration:none}.bar-light .button.activated,.bar-light .button.active{border-color:#ccc;background-color:#fafafa;box-shadow:inset 0 1px 3px rgba(0,0,0,.15)}.bar-light .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#444;font-size:17px}.bar-light .button.button-icon{border-color:transparent;background:0 0}.bar-stable .button{border-color:#b2b2b2;background-color:#f8f8f8;color:#444}.bar-stable .button:hover{color:#444;text-decoration:none}.bar-stable .button.activated,.bar-stable .button.active{border-color:#a2a2a2;background-color:#e5e5e5;box-shadow:inset 0 1px 3px rgba(0,0,0,.15)}.bar-stable .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#444;font-size:17px}.bar-stable .button.button-icon{border-color:transparent;background:0 0}.bar-positive .button{border-color:#145fd7;background-color:#4a87ee;color:#fff}.bar-positive .button:hover{color:#fff;text-decoration:none}.bar-positive .button.activated,.bar-positive .button.active{border-color:#145fd7;background-color:#145fd7;box-shadow:inset 0 1px 3px rgba(0,0,0,.15)}.bar-positive .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-positive .button.button-icon{border-color:transparent;background:0 0}.bar-calm .button{border-color:#1aacc3;background-color:#43cee6;color:#fff}.bar-calm .button:hover{color:#fff;text-decoration:none}.bar-calm .button.activated,.bar-calm .button.active{border-color:#1aacc3;background-color:#1aacc3;box-shadow:inset 0 1px 3px rgba(0,0,0,.15)}.bar-calm .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-calm .button.button-icon{border-color:transparent;background:0 0}.bar-assertive .button{border-color:#cc2311;background-color:#ef4e3a;color:#fff}.bar-assertive .button:hover{color:#fff;text-decoration:none}.bar-assertive .button.activated,.bar-assertive .button.active{border-color:#cc2311;background-color:#cc2311;box-shadow:inset 0 1px 3px rgba(0,0,0,.15)}.bar-assertive .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-assertive .button.button-icon{border-color:transparent;background:0 0}.bar-balanced .button{border-color:#498f24;background-color:#6c3;color:#fff}.bar-balanced .button:hover{color:#fff;text-decoration:none}.bar-balanced .button.activated,.bar-balanced .button.active{border-color:#498f24;background-color:#498f24;box-shadow:inset 0 1px 3px rgba(0,0,0,.15)}.bar-balanced .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-balanced .button.button-icon{border-color:transparent;background:0 0}.bar-energized .button{border-color:#d39211;background-color:#f0b840;color:#fff}.bar-energized .button:hover{color:#fff;text-decoration:none}.bar-energized .button.activated,.bar-energized .button.active{border-color:#d39211;background-color:#d39211;box-shadow:inset 0 1px 3px rgba(0,0,0,.15)}.bar-energized .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-energized .button.button-icon{border-color:transparent;background:0 0}.bar-royal .button{border-color:#552bdf;background-color:#8a6de9;color:#fff}.bar-royal .button:hover{color:#fff;text-decoration:none}.bar-royal .button.activated,.bar-royal .button.active{border-color:#552bdf;background-color:#552bdf;box-shadow:inset 0 1px 3px rgba(0,0,0,.15)}.bar-royal .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-royal .button.button-icon{border-color:transparent;background:0 0}.bar-dark .button{border-color:#111;background-color:#444;color:#fff}.bar-dark .button:hover{color:#fff;text-decoration:none}.bar-dark .button.activated,.bar-dark .button.active{border-color:#000;background-color:#262626;box-shadow:inset 0 1px 3px rgba(0,0,0,.15)}.bar-dark .button.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#fff;font-size:17px}.bar-dark .button.button-icon{border-color:transparent;background:0 0}.bar-header{top:0;border-top-width:0;border-bottom-width:1px}.bar-header.has-tabs-top{border-bottom-width:0}.bar-footer{bottom:0;border-top-width:1px;border-bottom-width:0;background-position:top}.bar-footer.item-input-inset{position:absolute}.bar-tabs{padding:0}.bar-subheader{top:44px;display:block}.bar-subfooter{bottom:44px;display:block}.tabs{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-direction:normal;-webkit-box-orient:horizontal;-webkit-flex-direction:horizontal;-moz-flex-direction:horizontal;-ms-flex-direction:horizontal;flex-direction:horizontal;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;-moz-justify-content:center;justify-content:center;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);border-color:#b2b2b2;background-color:#f8f8f8;background-image:linear-gradient(0deg,#b2b2b2,#b2b2b2 50%,transparent 50%);color:#444;position:absolute;bottom:0;z-index:5;width:100%;height:49px;border-style:solid;border-top-width:1px;background-size:0;line-height:49px}.tabs .tab-item .badge{background-color:#444;color:#f8f8f8}@media (min--moz-device-pixel-ratio:1.5),(-webkit-min-device-pixel-ratio:1.5),(min-device-pixel-ratio:1.5),(min-resolution:144dpi),(min-resolution:1.5dppx){.tabs{padding-top:2px;border-top:none!important;border-bottom:none;background-position:top;background-size:100% 1px;background-repeat:no-repeat}}.tabs-light>.tabs,.tabs.tabs-light{border-color:#ddd;background-color:#fff;background-image:linear-gradient(0deg,#ddd,#ddd 50%,transparent 50%);color:#444}.tabs-light>.tabs .tab-item .badge,.tabs.tabs-light .tab-item .badge{background-color:#444;color:#fff}.tabs-stable>.tabs,.tabs.tabs-stable{border-color:#b2b2b2;background-color:#f8f8f8;background-image:linear-gradient(0deg,#b2b2b2,#b2b2b2 50%,transparent 50%);color:#444}.tabs-stable>.tabs .tab-item .badge,.tabs.tabs-stable .tab-item .badge{background-color:#444;color:#f8f8f8}.tabs-positive>.tabs,.tabs.tabs-positive{border-color:#145fd7;background-color:#4a87ee;background-image:linear-gradient(0deg,#145fd7,#145fd7 50%,transparent 50%);color:#fff}.tabs-positive>.tabs .tab-item .badge,.tabs.tabs-positive .tab-item .badge{background-color:#fff;color:#4a87ee}.tabs-calm>.tabs,.tabs.tabs-calm{border-color:#1aacc3;background-color:#43cee6;background-image:linear-gradient(0deg,#1aacc3,#1aacc3 50%,transparent 50%);color:#fff}.tabs-calm>.tabs .tab-item .badge,.tabs.tabs-calm .tab-item .badge{background-color:#fff;color:#43cee6}.tabs-assertive>.tabs,.tabs.tabs-assertive{border-color:#cc2311;background-color:#ef4e3a;background-image:linear-gradient(0deg,#cc2311,#cc2311 50%,transparent 50%);color:#fff}.tabs-assertive>.tabs .tab-item .badge,.tabs.tabs-assertive .tab-item .badge{background-color:#fff;color:#ef4e3a}.tabs-balanced>.tabs,.tabs.tabs-balanced{border-color:#498f24;background-color:#6c3;background-image:linear-gradient(0deg,#498f24,#498f24 50%,transparent 50%);color:#fff}.tabs-balanced>.tabs .tab-item .badge,.tabs.tabs-balanced .tab-item .badge{background-color:#fff;color:#6c3}.tabs-energized>.tabs,.tabs.tabs-energized{border-color:#d39211;background-color:#f0b840;background-image:linear-gradient(0deg,#d39211,#d39211 50%,transparent 50%);color:#fff}.tabs-energized>.tabs .tab-item .badge,.tabs.tabs-energized .tab-item .badge{background-color:#fff;color:#f0b840}.tabs-royal>.tabs,.tabs.tabs-royal{border-color:#552bdf;background-color:#8a6de9;background-image:linear-gradient(0deg,#552bdf,#552bdf 50%,transparent 50%);color:#fff}.tabs-royal>.tabs .tab-item .badge,.tabs.tabs-royal .tab-item .badge{background-color:#fff;color:#8a6de9}.tabs-dark>.tabs,.tabs.tabs-dark{border-color:#111;background-color:#444;background-image:linear-gradient(0deg,#111,#111 50%,transparent 50%);color:#fff}.tabs-dark>.tabs .tab-item .badge,.tabs.tabs-dark .tab-item .badge{background-color:#fff;color:#444}.tabs-striped .tabs{background-color:#fff;background-image:none;border:none;box-shadow:0 2px 3px rgba(0,0,0,.15);padding-top:2px}.tabs-striped.tabs-light .tabs{background-color:#444}.tabs-striped.tabs-light .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-light .tab-item .badge{opacity:.4}.tabs-striped.tabs-light .tab-item.activated,.tabs-striped.tabs-light .tab-item.active,.tabs-striped.tabs-light .tab-item.tab-item-active{margin-top:-2px;color:#fff;border-style:solid;border-width:2px 0 0;border-color:#fff}.tabs-striped.tabs-light .tab-item.activated .badge,.tabs-striped.tabs-light .tab-item.active .badge,.tabs-striped.tabs-light .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-stable .tabs{background-color:#444}.tabs-striped.tabs-stable .tab-item{color:rgba(248,248,248,.4);opacity:1}.tabs-striped.tabs-stable .tab-item .badge{opacity:.4}.tabs-striped.tabs-stable .tab-item.activated,.tabs-striped.tabs-stable .tab-item.active,.tabs-striped.tabs-stable .tab-item.tab-item-active{margin-top:-2px;color:#f8f8f8;border-style:solid;border-width:2px 0 0;border-color:#f8f8f8}.tabs-striped.tabs-stable .tab-item.activated .badge,.tabs-striped.tabs-stable .tab-item.active .badge,.tabs-striped.tabs-stable .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-positive .tabs{background-color:#fff}.tabs-striped.tabs-positive .tab-item{color:rgba(74,135,238,.4);opacity:1}.tabs-striped.tabs-positive .tab-item .badge{opacity:.4}.tabs-striped.tabs-positive .tab-item.activated,.tabs-striped.tabs-positive .tab-item.active,.tabs-striped.tabs-positive .tab-item.tab-item-active{margin-top:-2px;color:#4a87ee;border-style:solid;border-width:2px 0 0;border-color:#4a87ee}.tabs-striped.tabs-positive .tab-item.activated .badge,.tabs-striped.tabs-positive .tab-item.active .badge,.tabs-striped.tabs-positive .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-calm .tabs{background-color:#fff}.tabs-striped.tabs-calm .tab-item{color:rgba(67,206,230,.4);opacity:1}.tabs-striped.tabs-calm .tab-item .badge{opacity:.4}.tabs-striped.tabs-calm .tab-item.activated,.tabs-striped.tabs-calm .tab-item.active,.tabs-striped.tabs-calm .tab-item.tab-item-active{margin-top:-2px;color:#43cee6;border-style:solid;border-width:2px 0 0;border-color:#43cee6}.tabs-striped.tabs-calm .tab-item.activated .badge,.tabs-striped.tabs-calm .tab-item.active .badge,.tabs-striped.tabs-calm .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-assertive .tabs{background-color:#fff}.tabs-striped.tabs-assertive .tab-item{color:rgba(239,78,58,.4);opacity:1}.tabs-striped.tabs-assertive .tab-item .badge{opacity:.4}.tabs-striped.tabs-assertive .tab-item.activated,.tabs-striped.tabs-assertive .tab-item.active,.tabs-striped.tabs-assertive .tab-item.tab-item-active{margin-top:-2px;color:#ef4e3a;border-style:solid;border-width:2px 0 0;border-color:#ef4e3a}.tabs-striped.tabs-assertive .tab-item.activated .badge,.tabs-striped.tabs-assertive .tab-item.active .badge,.tabs-striped.tabs-assertive .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-balanced .tabs{background-color:#fff}.tabs-striped.tabs-balanced .tab-item{color:rgba(102,204,51,.4);opacity:1}.tabs-striped.tabs-balanced .tab-item .badge{opacity:.4}.tabs-striped.tabs-balanced .tab-item.activated,.tabs-striped.tabs-balanced .tab-item.active,.tabs-striped.tabs-balanced .tab-item.tab-item-active{margin-top:-2px;color:#6c3;border-style:solid;border-width:2px 0 0;border-color:#6c3}.tabs-striped.tabs-balanced .tab-item.activated .badge,.tabs-striped.tabs-balanced .tab-item.active .badge,.tabs-striped.tabs-balanced .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-energized .tabs{background-color:#fff}.tabs-striped.tabs-energized .tab-item{color:rgba(240,184,64,.4);opacity:1}.tabs-striped.tabs-energized .tab-item .badge{opacity:.4}.tabs-striped.tabs-energized .tab-item.activated,.tabs-striped.tabs-energized .tab-item.active,.tabs-striped.tabs-energized .tab-item.tab-item-active{margin-top:-2px;color:#f0b840;border-style:solid;border-width:2px 0 0;border-color:#f0b840}.tabs-striped.tabs-energized .tab-item.activated .badge,.tabs-striped.tabs-energized .tab-item.active .badge,.tabs-striped.tabs-energized .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-royal .tabs{background-color:#fff}.tabs-striped.tabs-royal .tab-item{color:rgba(138,109,233,.4);opacity:1}.tabs-striped.tabs-royal .tab-item .badge{opacity:.4}.tabs-striped.tabs-royal .tab-item.activated,.tabs-striped.tabs-royal .tab-item.active,.tabs-striped.tabs-royal .tab-item.tab-item-active{margin-top:-2px;color:#8a6de9;border-style:solid;border-width:2px 0 0;border-color:#8a6de9}.tabs-striped.tabs-royal .tab-item.activated .badge,.tabs-striped.tabs-royal .tab-item.active .badge,.tabs-striped.tabs-royal .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-dark .tabs{background-color:#fff}.tabs-striped.tabs-dark .tab-item{color:rgba(68,68,68,.4);opacity:1}.tabs-striped.tabs-dark .tab-item .badge{opacity:.4}.tabs-striped.tabs-dark .tab-item.activated,.tabs-striped.tabs-dark .tab-item.active,.tabs-striped.tabs-dark .tab-item.tab-item-active{margin-top:-2px;color:#444;border-style:solid;border-width:2px 0 0;border-color:#444}.tabs-striped.tabs-dark .tab-item.activated .badge,.tabs-striped.tabs-dark .tab-item.active .badge,.tabs-striped.tabs-dark .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-top .tab-item.activated .badge,.tabs-striped.tabs-top .tab-item.active .badge,.tabs-striped.tabs-top .tab-item.tab-item-active .badge{top:4%}.tabs-striped.tabs-background-light .tabs{background-color:#fff}.tabs-striped.tabs-background-stable .tabs{background-color:#f8f8f8}.tabs-striped.tabs-background-positive .tabs{background-color:#4a87ee}.tabs-striped.tabs-background-calm .tabs{background-color:#43cee6}.tabs-striped.tabs-background-assertive .tabs{background-color:#ef4e3a}.tabs-striped.tabs-background-balanced .tabs{background-color:#6c3}.tabs-striped.tabs-background-energized .tabs{background-color:#f0b840}.tabs-striped.tabs-background-royal .tabs{background-color:#8a6de9}.tabs-striped.tabs-background-dark .tabs{background-color:#444}.tabs-striped.tabs-color-light .tab-item{color:rgba(255,255,255,.4);opacity:1}.tabs-striped.tabs-color-light .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-light .tab-item.activated,.tabs-striped.tabs-color-light .tab-item.active,.tabs-striped.tabs-color-light .tab-item.tab-item-active{margin-top:-2px;color:#fff;border:0 solid #fff;border-top-width:2px}.tabs-striped.tabs-color-light .tab-item.activated .badge,.tabs-striped.tabs-color-light .tab-item.active .badge,.tabs-striped.tabs-color-light .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-stable .tab-item{color:rgba(248,248,248,.4);opacity:1}.tabs-striped.tabs-color-stable .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-stable .tab-item.activated,.tabs-striped.tabs-color-stable .tab-item.active,.tabs-striped.tabs-color-stable .tab-item.tab-item-active{margin-top:-2px;color:#f8f8f8;border:0 solid #f8f8f8;border-top-width:2px}.tabs-striped.tabs-color-stable .tab-item.activated .badge,.tabs-striped.tabs-color-stable .tab-item.active .badge,.tabs-striped.tabs-color-stable .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-positive .tab-item{color:rgba(74,135,238,.4);opacity:1}.tabs-striped.tabs-color-positive .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-positive .tab-item.activated,.tabs-striped.tabs-color-positive .tab-item.active,.tabs-striped.tabs-color-positive .tab-item.tab-item-active{margin-top:-2px;color:#4a87ee;border:0 solid #4a87ee;border-top-width:2px}.tabs-striped.tabs-color-positive .tab-item.activated .badge,.tabs-striped.tabs-color-positive .tab-item.active .badge,.tabs-striped.tabs-color-positive .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-calm .tab-item{color:rgba(67,206,230,.4);opacity:1}.tabs-striped.tabs-color-calm .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-calm .tab-item.activated,.tabs-striped.tabs-color-calm .tab-item.active,.tabs-striped.tabs-color-calm .tab-item.tab-item-active{margin-top:-2px;color:#43cee6;border:0 solid #43cee6;border-top-width:2px}.tabs-striped.tabs-color-calm .tab-item.activated .badge,.tabs-striped.tabs-color-calm .tab-item.active .badge,.tabs-striped.tabs-color-calm .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-assertive .tab-item{color:rgba(239,78,58,.4);opacity:1}.tabs-striped.tabs-color-assertive .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-assertive .tab-item.activated,.tabs-striped.tabs-color-assertive .tab-item.active,.tabs-striped.tabs-color-assertive .tab-item.tab-item-active{margin-top:-2px;color:#ef4e3a;border:0 solid #ef4e3a;border-top-width:2px}.tabs-striped.tabs-color-assertive .tab-item.activated .badge,.tabs-striped.tabs-color-assertive .tab-item.active .badge,.tabs-striped.tabs-color-assertive .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-balanced .tab-item{color:rgba(102,204,51,.4);opacity:1}.tabs-striped.tabs-color-balanced .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-balanced .tab-item.activated,.tabs-striped.tabs-color-balanced .tab-item.active,.tabs-striped.tabs-color-balanced .tab-item.tab-item-active{margin-top:-2px;color:#6c3;border:0 solid #6c3;border-top-width:2px}.tabs-striped.tabs-color-balanced .tab-item.activated .badge,.tabs-striped.tabs-color-balanced .tab-item.active .badge,.tabs-striped.tabs-color-balanced .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-energized .tab-item{color:rgba(240,184,64,.4);opacity:1}.tabs-striped.tabs-color-energized .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-energized .tab-item.activated,.tabs-striped.tabs-color-energized .tab-item.active,.tabs-striped.tabs-color-energized .tab-item.tab-item-active{margin-top:-2px;color:#f0b840;border:0 solid #f0b840;border-top-width:2px}.tabs-striped.tabs-color-energized .tab-item.activated .badge,.tabs-striped.tabs-color-energized .tab-item.active .badge,.tabs-striped.tabs-color-energized .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-royal .tab-item{color:rgba(138,109,233,.4);opacity:1}.tabs-striped.tabs-color-royal .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-royal .tab-item.activated,.tabs-striped.tabs-color-royal .tab-item.active,.tabs-striped.tabs-color-royal .tab-item.tab-item-active{margin-top:-2px;color:#8a6de9;border:0 solid #8a6de9;border-top-width:2px}.tabs-striped.tabs-color-royal .tab-item.activated .badge,.tabs-striped.tabs-color-royal .tab-item.active .badge,.tabs-striped.tabs-color-royal .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-striped.tabs-color-dark .tab-item{color:rgba(68,68,68,.4);opacity:1}.tabs-striped.tabs-color-dark .tab-item .badge{opacity:.4}.tabs-striped.tabs-color-dark .tab-item.activated,.tabs-striped.tabs-color-dark .tab-item.active,.tabs-striped.tabs-color-dark .tab-item.tab-item-active{margin-top:-2px;color:#444;border:0 solid #444;border-top-width:2px}.tabs-striped.tabs-color-dark .tab-item.activated .badge,.tabs-striped.tabs-color-dark .tab-item.active .badge,.tabs-striped.tabs-color-dark .tab-item.tab-item-active .badge{top:2px;opacity:1}.tabs-top.tabs-striped{padding-bottom:0}.tabs-top.tabs-striped .tab-item{background:0 0;-webkit-transition:all .1s ease;-moz-transition:all .1s ease;-ms-transition:all .1s ease;-o-transition:all .1s ease;transition:all .1s ease}.tabs-top.tabs-striped .tab-item.activated,.tabs-top.tabs-striped .tab-item.active,.tabs-top.tabs-striped .tab-item.tab-item-active{margin-top:0;margin-bottom:-2px;border-width:0 0 2px!important;border-style:solid}.tabs-top.tabs-striped .tab-item .badge{-webkit-transition:all .2s ease;-moz-transition:all .2s ease;-ms-transition:all .2s ease;-o-transition:all .2s ease;transition:all .2s ease}.tabs-top>.tabs,.tabs.tabs-top{top:44px;padding-top:0;background-position:bottom}.tabs-top>.tabs .tab-item.activated .badge,.tabs-top>.tabs .tab-item.active .badge,.tabs-top>.tabs .tab-item.tab-item-active .badge,.tabs.tabs-top .tab-item.activated .badge,.tabs.tabs-top .tab-item.active .badge,.tabs.tabs-top .tab-item.tab-item-active .badge{top:4%}.tabs-top~.bar-header{border-bottom-width:0}.tab-item{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;overflow:hidden;max-width:150px;height:100%;color:inherit;text-align:center;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;font-weight:400;font-size:14px;font-family:"Helvetica Neue-Light","Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;opacity:.7}.tab-item:hover{cursor:pointer}.tab-item.tab-hidden,.tabs-item-hide>.tabs,.tabs.tabs-item-hide{display:none}.tabs-icon-bottom.tabs .tab-item,.tabs-icon-bottom>.tabs .tab-item,.tabs-icon-top.tabs .tab-item,.tabs-icon-top>.tabs .tab-item{font-size:12px;line-height:14px}.tab-item .icon{display:block;margin:0 auto;height:32px;font-size:32px}.tabs-icon-left.tabs .tab-item,.tabs-icon-left>.tabs .tab-item,.tabs-icon-right.tabs .tab-item,.tabs-icon-right>.tabs .tab-item{font-size:12px}.tabs-icon-left.tabs .tab-item .icon,.tabs-icon-left>.tabs .tab-item .icon,.tabs-icon-right.tabs .tab-item .icon,.tabs-icon-right>.tabs .tab-item .icon{display:inline-block;vertical-align:top;margin-top:-.1em}.tabs-icon-left.tabs .tab-item .icon:before,.tabs-icon-left>.tabs .tab-item .icon:before,.tabs-icon-right.tabs .tab-item .icon:before,.tabs-icon-right>.tabs .tab-item .icon:before{font-size:24px;line-height:49px}.tabs-icon-left.tabs .tab-item .icon,.tabs-icon-left>.tabs .tab-item .icon{padding-right:3px}.tabs-icon-right.tabs .tab-item .icon,.tabs-icon-right>.tabs .tab-item .icon{padding-left:3px}.tabs-icon-only.tabs .icon,.tabs-icon-only>.tabs .icon{line-height:inherit}.tab-item.has-badge{position:relative}.tab-item .badge{position:absolute;top:4%;right:33%;right:calc(50% - 26px);padding:1px 6px;height:auto;font-size:12px;line-height:16px}.tab-item.activated,.tab-item.active,.tab-item.tab-item-active{opacity:1}.tab-item.activated.tab-item-light,.tab-item.active.tab-item-light,.tab-item.tab-item-active.tab-item-light{color:#fff}.tab-item.activated.tab-item-stable,.tab-item.active.tab-item-stable,.tab-item.tab-item-active.tab-item-stable{color:#f8f8f8}.tab-item.activated.tab-item-positive,.tab-item.active.tab-item-positive,.tab-item.tab-item-active.tab-item-positive{color:#4a87ee}.tab-item.activated.tab-item-calm,.tab-item.active.tab-item-calm,.tab-item.tab-item-active.tab-item-calm{color:#43cee6}.tab-item.activated.tab-item-assertive,.tab-item.active.tab-item-assertive,.tab-item.tab-item-active.tab-item-assertive{color:#ef4e3a}.tab-item.activated.tab-item-balanced,.tab-item.active.tab-item-balanced,.tab-item.tab-item-active.tab-item-balanced{color:#6c3}.tab-item.activated.tab-item-energized,.tab-item.active.tab-item-energized,.tab-item.tab-item-active.tab-item-energized{color:#f0b840}.tab-item.activated.tab-item-royal,.tab-item.active.tab-item-royal,.tab-item.tab-item-active.tab-item-royal{color:#8a6de9}.tab-item.activated.tab-item-dark,.tab-item.active.tab-item-dark,.tab-item.tab-item-active.tab-item-dark{color:#444}.item.tabs{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;padding:0}.item.tabs .icon:before{position:relative}.tab-item.disabled,.tab-item[disabled]{opacity:.4;cursor:default;pointer-events:none}.tab-item.tab-item-android{border-top:2px solid inherit}.menu{position:absolute;top:0;bottom:0;z-index:0;overflow:hidden;min-height:100%;max-height:100%;width:275px;background-color:#fff}.menu .scroll-content{z-index:10}.menu .bar-header{z-index:11}.menu-content{-webkit-transform:none;-moz-transform:none;transform:none;box-shadow:-1px 0 2px rgba(0,0,0,.2),1px 0 2px rgba(0,0,0,.2)}.menu-open .menu-content .pane,.menu-open .menu-content .scroll-content{pointer-events:none}.grade-b .menu-content,.grade-c .menu-content{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;right:-1px;left:-1px;border-right:1px solid #ccc;border-left:1px solid #ccc;box-shadow:none}.menu-left{left:0}.menu-right{right:0}.menu-animated{-webkit-transition:-webkit-transform 200ms ease;-moz-transition:-moz-transform 200ms ease;transition:transform 200ms ease}.modal-backdrop{-webkit-transition:background-color 300ms ease-in-out;-moz-transition:background-color 300ms ease-in-out;transition:background-color 300ms ease-in-out;position:fixed;top:0;left:0;z-index:10;width:100%;height:100%;background-color:transparent}.modal-backdrop.active{background-color:rgba(0,0,0,.5)}.modal{display:block;position:absolute;top:0;z-index:10;overflow:hidden;min-height:100%;width:100%;background-color:#fff}@media (min-width:680px){.modal{top:20%;right:20%;bottom:20%;left:20%;overflow:visible;min-height:240px;width:60%}.modal.ng-leave-active{bottom:0}.platform-ios.platform-cordova .modal-wrapper .modal .bar-header:not(.bar-subheader){height:44px}.platform-ios.platform-cordova .modal-wrapper .modal .bar-header:not(.bar-subheader)>*{margin-top:0}.platform-ios.platform-cordova .modal-wrapper .modal .bar-subheader,.platform-ios.platform-cordova .modal-wrapper .modal .has-header,.platform-ios.platform-cordova .modal-wrapper .modal .tabs-top>.tabs,.platform-ios.platform-cordova .modal-wrapper .modal .tabs.tabs-top{top:44px}.platform-ios.platform-cordova .modal-wrapper .modal .has-subheader{top:88px}.platform-ios.platform-cordova .modal-wrapper .modal .has-tabs-top{top:93px}.platform-ios.platform-cordova .modal-wrapper .modal .has-header.has-subheader.has-tabs-top{top:137px}}.modal-open{pointer-events:none}.modal-open .modal,.modal-open .modal-backdrop{pointer-events:auto}.modal-open.loading-active .modal,.modal-open.loading-active .modal-backdrop{pointer-events:none}.popover-backdrop{position:fixed;top:0;left:0;z-index:10;width:100%;height:100%;background-color:transparent}.popover-backdrop.active{background-color:rgba(0,0,0,.1)}.popover{position:absolute;top:25%;left:50%;z-index:10;display:block;margin-left:-110px;margin-top:12px;height:280px;width:220px;background-color:#fff;box-shadow:0 1px 3px rgba(0,0,0,.4);opacity:0}.popover .item:first-child{border-top:0}.popover .item:last-child{border-bottom:0}.popover,.popover .bar-header{border-radius:2px}.popover .scroll-content{z-index:1;margin:2px 0}.popover .bar-header{border-bottom-right-radius:0;border-bottom-left-radius:0}.popover .has-header{border-top-right-radius:0;border-top-left-radius:0}.popover-arrow{display:none}.platform-ios .popover{box-shadow:0 0 40px rgba(0,0,0,.08)}.platform-ios .popover,.platform-ios .popover .bar-header{border-radius:10px}.platform-ios .popover .scroll-content{margin:8px 0;border-radius:10px}.platform-ios .popover .scroll-content.has-header{margin-top:0}.platform-ios .popover-arrow{position:absolute;top:-17px;left:43%;display:block;width:30px;height:19px;overflow:hidden}.platform-ios .popover-arrow:after{position:absolute;top:12px;left:5px;width:20px;height:20px;background-color:#fff;border-radius:3px;content:'';-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);transform:rotate(-45deg)}.platform-android .popover{background-color:#fafafa;box-shadow:0 2px 6px rgba(0,0,0,.35);margin-top:-32px}.platform-android .popover .item{border-color:#fafafa;background-color:#fafafa;color:#4d4d4d}.platform-android .popover-backdrop,.platform-android .popover-backdrop.active{background-color:transparent}.popover-open{pointer-events:none}.popover-open .popover,.popover-open .popover-backdrop{pointer-events:auto}.popover-open.loading-active .popover,.popover-open.loading-active .popover-backdrop{pointer-events:none}@media (min-width:680px){.popover{width:360px}}.popup{position:fixed;top:50%;left:50%;z-index:12;visibility:hidden;width:250px;max-width:100%;border-radius:0;background-color:rgba(255,255,255,.9)}.popup.popup-hidden{-webkit-animation-name:scaleOut;-moz-animation-name:scaleOut;animation-name:scaleOut;-webkit-animation-duration:.1s;-moz-animation-duration:.1s;animation-duration:.1s;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.popup.popup-showing{visibility:visible}.popup.active{-webkit-animation-name:superScaleIn;-moz-animation-name:superScaleIn;animation-name:superScaleIn;-webkit-animation-duration:.2s;-moz-animation-duration:.2s;animation-duration:.2s;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.popup.popup-tall{overflow:hidden}.popup.popup-tall .popup-body{overflow:auto}.popup-head{padding:15px 0;border-bottom:1px solid #eee;text-align:center}.popup-title{margin:0;padding:0;font-size:15px}.popup-sub-title{margin:5px 0 0;padding:0;font-weight:400;font-size:11px}.popup-body,.popup-buttons.row{padding:10px}.popup-buttons .button{margin:0 5px;min-height:45px;border-radius:2px;line-height:20px}.popup-buttons .button:first-child{margin-left:0}.popup-buttons .button:last-child{margin-right:0}.popup-open,.popup-open.modal-open .modal{pointer-events:none}.popup-open .popup,.popup-open .popup-backdrop{pointer-events:auto}.loading-container{position:absolute;left:0;top:0;right:0;bottom:0;z-index:13;display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;-moz-justify-content:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;-webkit-transition:.2s opacity linear;-moz-transition:.2s opacity linear;transition:.2s opacity linear;visibility:hidden;opacity:0}.loading-container.visible{visibility:visible}.loading-container.active{opacity:1}.loading-container .loading{padding:20px;border-radius:5px;background-color:rgba(0,0,0,.7);color:#fff;text-align:center;text-overflow:ellipsis;font-size:15px}.loading-container .loading h1,.loading-container .loading h2,.loading-container .loading h3,.loading-container .loading h4,.loading-container .loading h5,.loading-container .loading h6{color:#fff}.item{border-color:#ddd;background-color:#fff;color:#444;position:relative;z-index:2;display:block;margin:-1px;padding:16px;border-width:1px;border-style:solid;font-size:16px}.item h2{margin:0 0 4px;font-size:16px}.item h3{margin:0 0 4px;font-size:14px}.item h4{margin:0 0 4px;font-size:12px}.item h5,.item h6{margin:0 0 3px;font-size:10px}.item p{color:#666;font-size:14px}.item h1:last-child,.item h2:last-child,.item h3:last-child,.item h4:last-child,.item h5:last-child,.item h6:last-child,.item p:last-child{margin-bottom:0}.item .badge{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;position:absolute;top:16px;right:32px}.item.item-button-right .badge{right:67px}.item.item-divider .badge{top:8px}.item .badge+.badge{margin-right:5px}.item.item-light{border-color:#ddd;background-color:#fff;color:#444}.item.item-stable{border-color:#b2b2b2;background-color:#f8f8f8;color:#444}.item.item-positive{border-color:#145fd7;background-color:#4a87ee;color:#fff}.item.item-calm{border-color:#1aacc3;background-color:#43cee6;color:#fff}.item.item-assertive{border-color:#cc2311;background-color:#ef4e3a;color:#fff}.item.item-balanced{border-color:#498f24;background-color:#6c3;color:#fff}.item.item-energized{border-color:#d39211;background-color:#f0b840;color:#fff}.item.item-royal{border-color:#552bdf;background-color:#8a6de9;color:#fff}.item.item-dark{border-color:#111;background-color:#444;color:#fff}.item[ng-click]:hover{cursor:pointer}.item .item-content.activated,.item .item-content.active,.item-complex.activated .item-content,.item-complex.active .item-content,.item.activated,.item.active{border-color:#ccc;background-color:#D9D9D9}.item .item-content.activated.item-light,.item .item-content.active.item-light,.item-complex.activated .item-content.item-light,.item-complex.active .item-content.item-light,.item.activated.item-light,.item.active.item-light{border-color:#ccc;background-color:#fafafa}.item .item-content.activated.item-stable,.item .item-content.active.item-stable,.item-complex.activated .item-content.item-stable,.item-complex.active .item-content.item-stable,.item.activated.item-stable,.item.active.item-stable{border-color:#a2a2a2;background-color:#e5e5e5}.item .item-content.activated.item-positive,.item .item-content.active.item-positive,.item-complex.activated .item-content.item-positive,.item-complex.active .item-content.item-positive,.item.activated.item-positive,.item.active.item-positive{border-color:#145fd7;background-color:#145fd7}.item .item-content.activated.item-calm,.item .item-content.active.item-calm,.item-complex.activated .item-content.item-calm,.item-complex.active .item-content.item-calm,.item.activated.item-calm,.item.active.item-calm{border-color:#1aacc3;background-color:#1aacc3}.item .item-content.activated.item-assertive,.item .item-content.active.item-assertive,.item-complex.activated .item-content.item-assertive,.item-complex.active .item-content.item-assertive,.item.activated.item-assertive,.item.active.item-assertive{border-color:#cc2311;background-color:#cc2311}.item .item-content.activated.item-balanced,.item .item-content.active.item-balanced,.item-complex.activated .item-content.item-balanced,.item-complex.active .item-content.item-balanced,.item.activated.item-balanced,.item.active.item-balanced{border-color:#498f24;background-color:#498f24}.item .item-content.activated.item-energized,.item .item-content.active.item-energized,.item-complex.activated .item-content.item-energized,.item-complex.active .item-content.item-energized,.item.activated.item-energized,.item.active.item-energized{border-color:#d39211;background-color:#d39211}.item .item-content.activated.item-royal,.item .item-content.active.item-royal,.item-complex.activated .item-content.item-royal,.item-complex.active .item-content.item-royal,.item.activated.item-royal,.item.active.item-royal{border-color:#552bdf;background-color:#552bdf}.item .item-content.activated.item-dark,.item .item-content.active.item-dark,.item-complex.activated .item-content.item-dark,.item-complex.active .item-content.item-dark,.item.activated.item-dark,.item.active.item-dark{border-color:#000;background-color:#262626}.item,.item h1,.item h2,.item h3,.item h4,.item h5,.item h6,.item p,.item-content,.item-content h1,.item-content h2,.item-content h3,.item-content h4,.item-content h5,.item-content h6,.item-content p{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}a.item{color:inherit;text-decoration:none}a.item:focus,a.item:hover{text-decoration:none}.item-complex,a.item.item-complex,button.item.item-complex{padding:0}.item-complex .item-content,.item-radio .item-content{position:relative;z-index:2;padding:16px 49px 16px 16px;border:none;background-color:#fff}a.item-content{display:block;color:inherit;text-decoration:none}.item-body h1,.item-body h2,.item-body h3,.item-body h4,.item-body h5,.item-body h6,.item-body p,.item-complex.item-text-wrap,.item-complex.item-text-wrap .item-content,.item-complex.item-text-wrap h1,.item-complex.item-text-wrap h2,.item-complex.item-text-wrap h3,.item-complex.item-text-wrap h4,.item-complex.item-text-wrap h5,.item-complex.item-text-wrap h6,.item-complex.item-text-wrap p,.item-text-wrap,.item-text-wrap .item,.item-text-wrap .item-content,.item-text-wrap h1,.item-text-wrap h2,.item-text-wrap h3,.item-text-wrap h4,.item-text-wrap h5,.item-text-wrap h6,.item-text-wrap p{overflow:visible;white-space:normal}.item-complex.item-light>.item-content{border-color:#ddd;background-color:#fff;color:#444}.item-complex.item-light>.item-content.active,.item-complex.item-light>.item-content:active{border-color:#ccc;background-color:#fafafa}.item-complex.item-stable>.item-content{border-color:#b2b2b2;background-color:#f8f8f8;color:#444}.item-complex.item-stable>.item-content.active,.item-complex.item-stable>.item-content:active{border-color:#a2a2a2;background-color:#e5e5e5}.item-complex.item-positive>.item-content{border-color:#145fd7;background-color:#4a87ee;color:#fff}.item-complex.item-positive>.item-content.active,.item-complex.item-positive>.item-content:active{border-color:#145fd7;background-color:#145fd7}.item-complex.item-calm>.item-content{border-color:#1aacc3;background-color:#43cee6;color:#fff}.item-complex.item-calm>.item-content.active,.item-complex.item-calm>.item-content:active{border-color:#1aacc3;background-color:#1aacc3}.item-complex.item-assertive>.item-content{border-color:#cc2311;background-color:#ef4e3a;color:#fff}.item-complex.item-assertive>.item-content.active,.item-complex.item-assertive>.item-content:active{border-color:#cc2311;background-color:#cc2311}.item-complex.item-balanced>.item-content{border-color:#498f24;background-color:#6c3;color:#fff}.item-complex.item-balanced>.item-content.active,.item-complex.item-balanced>.item-content:active{border-color:#498f24;background-color:#498f24}.item-complex.item-energized>.item-content{border-color:#d39211;background-color:#f0b840;color:#fff}.item-complex.item-energized>.item-content.active,.item-complex.item-energized>.item-content:active{border-color:#d39211;background-color:#d39211}.item-complex.item-royal>.item-content{border-color:#552bdf;background-color:#8a6de9;color:#fff}.item-complex.item-royal>.item-content.active,.item-complex.item-royal>.item-content:active{border-color:#552bdf;background-color:#552bdf}.item-complex.item-dark>.item-content{border-color:#111;background-color:#444;color:#fff}.item-complex.item-dark>.item-content.active,.item-complex.item-dark>.item-content:active{border-color:#000;background-color:#262626}.item-icon-left .icon,.item-icon-right .icon{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:0;height:100%;font-size:32px}.item-icon-left .icon:before,.item-icon-right .icon:before{display:block;width:32px;text-align:center}.item .fill-icon{min-width:30px;min-height:30px;font-size:28px}.item-icon-left{padding-left:54px}.item-icon-left .icon{left:11px}.item-complex.item-icon-left{padding-left:0}.item-complex.item-icon-left .item-content{padding-left:54px}.item-icon-right{padding-right:54px}.item-icon-right .icon{right:11px}.item-complex.item-icon-right{padding-right:0}.item-complex.item-icon-right .item-content{padding-right:54px}.item-icon-left.item-icon-right .icon:first-child{right:auto}.item-icon-left .item-delete .icon,.item-icon-left.item-icon-right .icon:last-child{left:auto}.item-icon-left .icon-accessory,.item-icon-right .icon-accessory{color:#ccc;font-size:16px}.item-icon-left .icon-accessory{left:3px}.item-icon-right .icon-accessory{right:3px}.item-button-left{padding-left:72px}.item-button-left .item-content>.button,.item-button-left>.button{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:8px;left:11px;min-width:34px;min-height:34px;font-size:18px;line-height:32px}.item-button-left .item-content>.button .icon:before,.item-button-left>.button .icon:before{position:relative;left:auto;width:auto;line-height:31px}.item-button-left .item-content>.button>.button,.item-button-left>.button>.button{margin:0 2px;min-height:34px;font-size:18px;line-height:32px}.item-button-right,a.item.item-button-right,button.item.item-button-right{padding-right:80px}.item-button-right .item-content>.button,.item-button-right .item-content>.buttons,.item-button-right>.button,.item-button-right>.buttons{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:8px;right:16px;min-width:34px;min-height:34px;font-size:18px;line-height:32px}.item-button-right .item-content>.button .icon:before,.item-button-right .item-content>.buttons .icon:before,.item-button-right>.button .icon:before,.item-button-right>.buttons .icon:before{position:relative;left:auto;width:auto;line-height:31px}.item-button-right .item-content>.button>.button,.item-button-right .item-content>.buttons>.button,.item-button-right>.button>.button,.item-button-right>.buttons>.button{margin:0 2px;min-width:34px;min-height:34px;font-size:18px;line-height:32px}.item-avatar,.item-avatar .item-content,.item-avatar-left,.item-avatar-left .item-content{padding-left:72px;min-height:72px}.item-avatar .item-content .item-image,.item-avatar .item-content>img:first-child,.item-avatar .item-image,.item-avatar-left .item-content .item-image,.item-avatar-left .item-content>img:first-child,.item-avatar-left .item-image,.item-avatar-left>img:first-child,.item-avatar>img:first-child{position:absolute;top:16px;left:16px;max-width:40px;max-height:40px;width:100%;border-radius:4px}.item-avatar-right,.item-avatar-right .item-content{padding-right:72px;min-height:72px}.item-avatar-right .item-content .item-image,.item-avatar-right .item-content>img:first-child,.item-avatar-right .item-image,.item-avatar-right>img:first-child{position:absolute;top:16px;right:16px;max-width:40px;max-height:40px;width:100%;border-radius:4px}.item-thumbnail-left,.item-thumbnail-left .item-content{padding-left:106px;min-height:100px}.item-thumbnail-left .item-content .item-image,.item-thumbnail-left .item-content>img:first-child,.item-thumbnail-left .item-image,.item-thumbnail-left>img:first-child{position:absolute;top:10px;left:10px;max-width:80px;max-height:80px;width:100%}.item-avatar-left.item-complex,.item-avatar.item-complex,.item-thumbnail-left.item-complex{padding-left:0}.item-thumbnail-right,.item-thumbnail-right .item-content{padding-right:106px;min-height:100px}.item-thumbnail-right .item-content .item-image,.item-thumbnail-right .item-content>img:first-child,.item-thumbnail-right .item-image,.item-thumbnail-right>img:first-child{position:absolute;top:10px;right:10px;max-width:80px;max-height:80px;width:100%}.item-avatar-right.item-complex,.item-thumbnail-right.item-complex{padding-right:0}.item-image{padding:0;text-align:center}.item-image .list-img,.item-image img:first-child{width:100%;vertical-align:middle}.item-body{overflow:auto;padding:16px;text-overflow:inherit;white-space:normal}.item-body h1,.item-body h2,.item-body h3,.item-body h4,.item-body h5,.item-body h6,.item-body p{margin-top:16px;margin-bottom:16px}.item-divider{padding-top:8px;padding-bottom:8px;min-height:30px;background-color:#f5f5f5;color:#222;font-weight:700}.item-note{float:right;color:#aaa;font-size:14px}.item-left-editable .item-content,.item-right-editable .item-content{-webkit-transition-duration:250ms;-moz-transition-duration:250ms;transition-duration:250ms;-webkit-transition-timing-function:ease-in-out;-moz-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out;-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;transition-property:transform}.item-left-editing.item-left-editable .item-content,.list-left-editing .item-left-editable .item-content{-webkit-transform:translate3d(50px,0,0);-moz-transform:translate3d(50px,0,0);transform:translate3d(50px,0,0)}.item-right-editing.item-right-editable .item-content,.list-right-editing .item-right-editable .item-content{-webkit-transform:translate3d(-50px,0,0);-moz-transform:translate3d(-50px,0,0);transform:translate3d(-50px,0,0)}.item-left-edit{-webkit-transition:all ease-in-out 125ms;-moz-transition:all ease-in-out 125ms;transition:all ease-in-out 125ms;position:absolute;top:0;left:0;z-index:0;width:50px;height:100%;line-height:100%;display:none;opacity:0;-webkit-transform:translate3d(-21px,0,0);-moz-transform:translate3d(-21px,0,0);transform:translate3d(-21px,0,0)}.item-left-edit .button{height:100%}.item-left-edit .button.icon{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:0;height:100%}.item-left-edit.visible{display:block}.item-left-edit.visible.active{opacity:1;-webkit-transform:translate3d(8px,0,0);-moz-transform:translate3d(8px,0,0);transform:translate3d(8px,0,0)}.list-left-editing .item-left-edit{-webkit-transition-delay:125ms;-moz-transition-delay:125ms;transition-delay:125ms}.item-delete .button.icon{color:#ef4e3a;font-size:24px}.item-delete .button.icon:hover{opacity:.7}.item-right-edit{-webkit-transition:all ease-in-out 125ms;-moz-transition:all ease-in-out 125ms;transition:all ease-in-out 125ms;position:absolute;top:0;right:0;z-index:0;width:75px;height:100%;background:inherit;padding-left:20px;display:none;opacity:0;-webkit-transform:translate3d(25px,0,0);-moz-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}.item-right-edit .button{min-width:50px;height:100%}.item-right-edit .button.icon{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:0;height:100%;font-size:32px}.item-right-edit.visible{display:block;z-index:3}.item-right-edit.visible.active{opacity:1;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.list-right-editing .item-right-edit{-webkit-transition-delay:125ms;-moz-transition-delay:125ms;transition-delay:125ms}.item-reorder .button.icon{color:#444;font-size:32px}.item-reordering{position:absolute;left:0;top:0;z-index:9;width:100%;box-shadow:0 0 10px 0 #aaa}.item-reordering .item-reorder{z-index:1}.item-placeholder{opacity:.7}.item-options{position:absolute;top:0;right:0;z-index:1;height:100%}.item-options .button{height:100%;border:none;border-radius:0}.list{position:relative;padding-top:1px;padding-bottom:1px;padding-left:0;margin-bottom:20px}.list:last-child{margin-bottom:0}.list:last-child.card{margin-bottom:40px}.list-header{margin-top:20px;padding:5px 15px;background-color:transparent;color:#222;font-weight:700}.card.list .list-item{padding-right:1px;padding-left:1px}.card,.list-inset{overflow:hidden;margin:20px 10px;border-radius:2px;background-color:#fff}.card{padding-top:1px;padding-bottom:1px;box-shadow:0 1px 4px rgba(0,0,0,.25)}.padding .card,.padding .list-inset{margin-left:0;margin-right:0}.card .item:first-child,.card .item:first-child .item-content,.list-inset .item:first-child,.list-inset .item:first-child .item-content,.padding>.list .item:first-child,.padding>.list .item:first-child .item-content{border-top-left-radius:2px;border-top-right-radius:2px}.card .item:last-child,.card .item:last-child .item-content,.list-inset .item:last-child,.list-inset .item:last-child .item-content,.padding>.list .item:last-child,.padding>.list .item:last-child .item-content{border-bottom-right-radius:2px;border-bottom-left-radius:2px}.card .item:last-child,.list-inset .item:last-child{margin-bottom:-1px}.card .item,.list-inset .item,.padding-horizontal>.list .item,.padding>.list .item{margin-right:0;margin-left:0}.card .item.item-input input,.list-inset .item.item-input input,.padding-horizontal>.list .item.item-input input,.padding>.list .item.item-input input{padding-right:44px}.padding-left>.list .item{margin-left:0}.padding-right>.list .item{margin-right:0}.badge{background-color:transparent;color:#AAA;z-index:1;display:inline-block;padding:3px 8px;min-width:10px;border-radius:10px;vertical-align:baseline;text-align:center;white-space:nowrap;font-weight:700;font-size:14px;line-height:16px}.badge:empty{display:none}.badge.badge-light,.tabs .tab-item .badge.badge-light{background-color:#fff;color:#444}.badge.badge-stable,.tabs .tab-item .badge.badge-stable{background-color:#f8f8f8;color:#444}.badge.badge-positive,.tabs .tab-item .badge.badge-positive{background-color:#4a87ee;color:#fff}.badge.badge-calm,.tabs .tab-item .badge.badge-calm{background-color:#43cee6;color:#fff}.badge.badge-assertive,.tabs .tab-item .badge.badge-assertive{background-color:#ef4e3a;color:#fff}.badge.badge-balanced,.tabs .tab-item .badge.badge-balanced{background-color:#6c3;color:#fff}.badge.badge-energized,.tabs .tab-item .badge.badge-energized{background-color:#f0b840;color:#fff}.badge.badge-royal,.tabs .tab-item .badge.badge-royal{background-color:#8a6de9;color:#fff}.badge.badge-dark,.tabs .tab-item .badge.badge-dark{background-color:#444;color:#fff}.button .badge{position:relative;top:-1px}.slider{position:relative;visibility:hidden;overflow:hidden}.slider-slides{position:relative;height:100%}.slider-slide{position:relative;display:block;float:left;width:100%;height:100%;vertical-align:top}.slider-slide-image>img{width:100%}.slider-pager{position:absolute;bottom:20px;z-index:1;width:100%;height:15px;text-align:center}.slider-pager .slider-pager-page{display:inline-block;margin:0 3px;width:15px;color:#000;text-decoration:none;opacity:.3}.slider-pager .slider-pager-page.active{-webkit-transition:opacity .4s ease-in;-moz-transition:opacity .4s ease-in;transition:opacity .4s ease-in;opacity:1}.split-pane{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;-moz-align-items:stretch;align-items:stretch;width:100%;height:100%}.split-pane-menu{-webkit-box-flex:0;-webkit-flex:0 0 320px;-moz-box-flex:0;-moz-flex:0 0 320px;-ms-flex:0 0 320px;flex:0 0 320px;overflow-y:auto;width:320px;height:100%;border-right:1px solid #eee}@media all and (max-width:568px){.split-pane-menu{border-right:none}}.split-pane-content{-webkit-box-flex:1;-webkit-flex:1 0 auto;-moz-box-flex:1;-moz-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}form{margin:0 0 1.42857}legend{display:block;margin-bottom:1.42857;padding:0;width:100%;border:1px solid #ddd;color:#444;font-size:21px;line-height:2.85714}legend small{color:#f8f8f8;font-size:1.07143}button,input,label,select,textarea{font-weight:400;font-size:14px;line-height:1.42857}button,input,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif}.item-input{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:relative;overflow:hidden;padding:6px 0 5px 16px}.item-input input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-flex:1;-webkit-flex:1 0 220px;-moz-box-flex:1;-moz-flex:1 0 220px;-ms-flex:1 0 220px;flex:1 0 220px;-webkit-appearance:none;-moz-appearance:none;appearance:none;margin:0;padding-right:24px;background-color:transparent}.item-input .button .icon{-webkit-box-flex:0;-webkit-flex:0 0 24px;-moz-box-flex:0;-moz-flex:0 0 24px;-ms-flex:0 0 24px;flex:0 0 24px;position:static;display:inline-block;height:auto;text-align:center;font-size:16px}.item-input .button-bar{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-flex:1;-webkit-flex:1 0 220px;-moz-box-flex:1;-moz-flex:1 0 220px;-ms-flex:1 0 220px;flex:1 0 220px;-webkit-appearance:none;-moz-appearance:none;appearance:none}.item-input .icon{min-width:14px}.item-input-inset{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:relative;overflow:hidden;padding:10.67px}.item-input-wrapper{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1 0;-moz-box-flex:1;-moz-flex:1 0;-ms-flex:1 0;flex:1 0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;padding-right:8px;padding-left:8px;background:#eee}.item-input-inset .item-input-wrapper input{padding-left:4px;height:29px;background:0 0;line-height:18px}.item-input-wrapper~.button{margin-left:10.67px}.input-label{-webkit-box-flex:1;-webkit-flex:1 0 100px;-moz-box-flex:1;-moz-flex:1 0 100px;-ms-flex:1 0 100px;flex:1 0 100px;display:table;padding:7px 10px 7px 0;max-width:200px;width:35%;color:#444;font-size:16px}.placeholder-icon{color:#aaa}.placeholder-icon:first-child{padding-right:6px}.placeholder-icon:last-child{padding-left:6px}.item-stacked-label{display:block;background-color:transparent;box-shadow:none}.item-stacked-label .icon,.item-stacked-label .input-label{display:inline-block;padding:4px 0 0;vertical-align:middle}.item-stacked-label input,.item-stacked-label textarea{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;padding:4px 8px 3px 0;border:none;background-color:#fff}.item-stacked-label input{overflow:hidden;height:46px}.item-floating-label{display:block;background-color:transparent;box-shadow:none}.item-floating-label .input-label{position:relative;padding:5px 0 0;opacity:0;top:10px;-webkit-transition:opacity .15s ease-in,top .2s linear;-moz-transition:opacity .15s ease-in,top .2s linear;transition:opacity .15s ease-in,top .2s linear}.item-floating-label .input-label.has-input{opacity:1;top:0;-webkit-transition:opacity .15s ease-in,top .2s linear;-moz-transition:opacity .15s ease-in,top .2s linear;transition:opacity .15s ease-in,top .2s linear}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],textarea{display:block;padding-top:2px;padding-left:0;height:34px;color:#111;vertical-align:middle;font-size:14px;line-height:16px}.platform-android input[type=date],.platform-android input[type=datetime-local],.platform-android input[type=month],.platform-android input[type=time],.platform-android input[type=week],.platform-ios input[type=date],.platform-ios input[type=datetime-local],.platform-ios input[type=month],.platform-ios input[type=time],.platform-ios input[type=week]{padding-top:8px}input,textarea{width:100%}textarea{padding-left:0}textarea::-moz-placeholder{color:#aaa}textarea:-ms-input-placeholder{color:#aaa}textarea::-webkit-input-placeholder{color:#aaa;text-indent:-3px}textarea{height:auto}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],textarea{border:0}input[type=checkbox],input[type=radio]{margin:0;line-height:normal}input[type=button],input[type=checkbox],input[type=file],input[type=image],input[type=radio],input[type=reset],input[type=submit]{width:auto}input[type=file]{line-height:34px}.cloned-text-input+input,.cloned-text-input+textarea,.previous-input-focus{position:absolute!important;left:-9999px;width:200px}input::-moz-placeholder,textarea::-moz-placeholder{color:#aaa}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#aaa}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#aaa;text-indent:0}input[disabled],input[readonly]:not(.cloned-text-input),select[disabled],select[readonly],textarea[disabled],textarea[readonly]:not(.cloned-text-input){background-color:#f8f8f8;cursor:not-allowed}input[type=checkbox][disabled],input[type=checkbox][readonly],input[type=radio][disabled],input[type=radio][readonly]{background-color:transparent}.checkbox{position:relative;display:inline-block;padding:7px;cursor:pointer}.checkbox .checkbox-icon:before,.checkbox input:before{border-color:#4a87ee}.checkbox input:checked+.checkbox-icon:before,.checkbox input:checked:before{background:#4a87ee}.checkbox-light .checkbox-icon:before,.checkbox-light input:before{border-color:#ddd}.checkbox-light input:checked+.checkbox-icon:before,.checkbox-light input:checked:before{background:#ddd}.checkbox-stable .checkbox-icon:before,.checkbox-stable input:before{border-color:#b2b2b2}.checkbox-stable input:checked+.checkbox-icon:before,.checkbox-stable input:checked:before{background:#b2b2b2}.checkbox-positive .checkbox-icon:before,.checkbox-positive input:before{border-color:#4a87ee}.checkbox-positive input:checked+.checkbox-icon:before,.checkbox-positive input:checked:before{background:#4a87ee}.checkbox-calm .checkbox-icon:before,.checkbox-calm input:before{border-color:#43cee6}.checkbox-calm input:checked+.checkbox-icon:before,.checkbox-calm input:checked:before{background:#43cee6}.checkbox-assertive .checkbox-icon:before,.checkbox-assertive input:before{border-color:#ef4e3a}.checkbox-assertive input:checked+.checkbox-icon:before,.checkbox-assertive input:checked:before{background:#ef4e3a}.checkbox-balanced .checkbox-icon:before,.checkbox-balanced input:before{border-color:#6c3}.checkbox-balanced input:checked+.checkbox-icon:before,.checkbox-balanced input:checked:before{background:#6c3}.checkbox-energized .checkbox-icon:before,.checkbox-energized input:before{border-color:#f0b840}.checkbox-energized input:checked+.checkbox-icon:before,.checkbox-energized input:checked:before{background:#f0b840}.checkbox-royal .checkbox-icon:before,.checkbox-royal input:before{border-color:#8a6de9}.checkbox-royal input:checked+.checkbox-icon:before,.checkbox-royal input:checked:before{background:#8a6de9}.checkbox-dark .checkbox-icon:before,.checkbox-dark input:before{border-color:#444}.checkbox-dark input:checked+.checkbox-icon:before,.checkbox-dark input:checked:before{background:#444}.checkbox input:disabled+.checkbox-icon:before,.checkbox input:disabled:before{border-color:#ddd}.checkbox input:disabled:checked+.checkbox-icon:before,.checkbox input:disabled:checked:before{background:#ddd}.checkbox.checkbox-input-hidden input{display:none!important}.checkbox input,.checkbox-icon{position:relative;width:28px;height:28px;display:block;border:0;background:0 0;cursor:pointer;-webkit-appearance:none}.checkbox input:before,.checkbox-icon:before{display:table;width:100%;height:100%;border-width:1px;border-style:solid;border-radius:28px;background:#fff;content:' ';transition:background-color 20ms ease-in-out}.checkbox input:checked:before,input:checked+.checkbox-icon:before{border-width:2px}.checkbox input:after,.checkbox-icon:after{-webkit-transition:opacity .05s ease-in-out;-moz-transition:opacity .05s ease-in-out;transition:opacity .05s ease-in-out;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);transform:rotate(-45deg);position:absolute;top:30%;left:26%;display:table;width:15px;height:10.33px;border:3px solid #fff;border-top:0;border-right:0;content:' ';opacity:0}.grade-c .checkbox input:after,.grade-c .checkbox-icon:after{-webkit-transform:rotate(0);-moz-transform:rotate(0);transform:rotate(0);top:3px;left:4px;border:none;color:#fff;content:'\2713';font-weight:700;font-size:20px}.checkbox input:checked:after,input:checked+.checkbox-icon:after{opacity:1}.item-checkbox{padding-left:60px}.item-checkbox.active{box-shadow:none}.item-checkbox .checkbox{position:absolute;top:50%;right:8px;left:8px;z-index:3;margin-top:-21px}.item-checkbox.item-checkbox-right{padding-right:60px;padding-left:16px}.item-checkbox-right .checkbox input,.item-checkbox-right .checkbox-icon{float:right}.item-toggle{pointer-events:none}.toggle{position:relative;display:inline-block;pointer-events:auto;margin:-5px;padding:5px}.toggle input:checked+.track{border-color:#4a87ee;background-color:#4a87ee}.toggle.dragging .handle{background-color:#f2f2f2!important}.toggle.toggle-light input:checked+.track{border-color:#ddd;background-color:#ddd}.toggle.toggle-stable input:checked+.track{border-color:#b2b2b2;background-color:#b2b2b2}.toggle.toggle-positive input:checked+.track{border-color:#4a87ee;background-color:#4a87ee}.toggle.toggle-calm input:checked+.track{border-color:#43cee6;background-color:#43cee6}.toggle.toggle-assertive input:checked+.track{border-color:#ef4e3a;background-color:#ef4e3a}.toggle.toggle-balanced input:checked+.track{border-color:#6c3;background-color:#6c3}.toggle.toggle-energized input:checked+.track{border-color:#f0b840;background-color:#f0b840}.toggle.toggle-royal input:checked+.track{border-color:#8a6de9;background-color:#8a6de9}.toggle.toggle-dark input:checked+.track{border-color:#444;background-color:#444}.toggle input{display:none}.toggle .track{-webkit-transition-timing-function:ease-in-out;-moz-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out;-webkit-transition-duration:.2s;-moz-transition-duration:.2s;transition-duration:.2s;-webkit-transition-property:background-color,border;-moz-transition-property:background-color,border;transition-property:background-color,border;display:inline-block;box-sizing:border-box;width:54px;height:32px;border:2px solid #E5E5E5;border-radius:20px;background-color:#E5E5E5;content:' ';cursor:pointer;pointer-events:none}.platform-android4_2 .toggle .track{-webkit-background-clip:padding-box}.toggle .handle{-webkit-transition:.2s ease-in-out;-moz-transition:.2s ease-in-out;transition:.2s ease-in-out;position:absolute;display:block;width:28px;height:28px;border-radius:28px;background-color:#fff;top:7px;left:7px}.toggle .handle:before{position:absolute;top:-4px;left:-22px;padding:19px 35px;content:" "}.toggle input:checked+.track .handle{-webkit-transform:translate3d(22px,0,0);-moz-transform:translate3d(22px,0,0);transform:translate3d(22px,0,0);background-color:#fff}.item-toggle.active{box-shadow:none}.item-toggle,.item-toggle.item-complex .item-content{padding-right:102px}.item-toggle.item-complex{padding-right:0}.item-toggle .toggle{position:absolute;top:8px;right:16px;z-index:3}.toggle input:disabled+.track{opacity:.6}.item-radio{padding:0}.item-radio:hover{cursor:pointer}.item-radio .item-content{padding-right:64px}.item-radio .radio-icon{position:absolute;top:0;right:0;z-index:3;visibility:hidden;padding:14px;height:100%;font-size:24px}.item-radio input{position:absolute;left:-9999px}.item-radio input:checked~.item-content{background:#f7f7f7}.item-radio input:checked~.radio-icon{visibility:visible}.platform-android.grade-b .item-radio,.platform-android.grade-c .item-radio{-webkit-animation:androidCheckedbugfix infinite 1s}@-webkit-keyframes androidCheckedbugfix{from,to{padding:0}}input[type=range]{display:inline-block;overflow:hidden;margin-top:5px;margin-bottom:5px;padding-right:2px;padding-left:1px;width:auto;height:35px;outline:0;background:-webkit-gradient(linear,50% 0,50% 100%,color-stop(0%,#ccc),color-stop(100%,#ccc)) center/99% 4px no-repeat;background:linear-gradient(to right,#ccc 0,#ccc 100%) center/99% 4px no-repeat;-webkit-appearance:none}input[type=range]::-webkit-slider-thumb{position:relative;width:20px;height:20px;border-radius:10px;background-color:#fff;box-shadow:0 0 2px rgba(0,0,0,.5),1px 3px 5px rgba(0,0,0,.25);cursor:pointer;-webkit-appearance:none}input[type=range]::-webkit-slider-thumb:before{position:absolute;top:8px;left:-2001px;width:2000px;height:4px;background:#444;content:' '}input[type=range]::-webkit-slider-thumb:after{position:absolute;top:-20px;left:-20px;padding:30px;content:' '}.range{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;padding:2px 11px}.range.range-light input::-webkit-slider-thumb:before{background:#ddd}.range.range-stable input::-webkit-slider-thumb:before{background:#b2b2b2}.range.range-positive input::-webkit-slider-thumb:before{background:#4a87ee}.range.range-calm input::-webkit-slider-thumb:before{background:#43cee6}.range.range-balanced input::-webkit-slider-thumb:before{background:#6c3}.range.range-assertive input::-webkit-slider-thumb:before{background:#ef4e3a}.range.range-energized input::-webkit-slider-thumb:before{background:#f0b840}.range.range-royal input::-webkit-slider-thumb:before{background:#8a6de9}.range.range-dark input::-webkit-slider-thumb:before{background:#444}.range .icon{-webkit-box-flex:0;-webkit-flex:0;-moz-box-flex:0;-moz-flex:0;-ms-flex:0;flex:0;display:block;min-width:24px;text-align:center;font-size:24px}.range input{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;margin-right:10px;margin-left:10px}.range-label{-webkit-box-flex:0;-webkit-flex:0 0 auto;-moz-box-flex:0;-moz-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;display:block;white-space:nowrap}.range-label:first-child{padding-left:5px}.range input+.range-label{padding-right:5px;padding-left:0}.item-select{position:relative}.item-select select{-webkit-appearance:none;-moz-appearance:none;appearance:none;position:absolute;top:0;right:0;padding:14px 48px 16px 16px;max-width:65%;border:none;background:#fff;color:#333;text-indent:.01px;text-overflow:'';white-space:nowrap;font-size:14px;cursor:pointer;direction:rtl}.item-select select::-ms-expand{display:none}.item-select option{direction:ltr}.item-select:after{position:absolute;top:50%;right:16px;margin-top:-3px;width:0;height:0;border-top:5px solid;border-right:5px solid transparent;border-left:5px solid transparent;color:#999;content:"";pointer-events:none}.item-select.item-light select{background:#fff;color:#444}.item-select.item-stable select{background:#f8f8f8;color:#444}.item-select.item-stable .input-label,.item-select.item-stable:after{color:#656565}.item-select.item-positive select{background:#4a87ee;color:#fff}.item-select.item-positive .input-label,.item-select.item-positive:after{color:#fff}.item-select.item-calm select{background:#43cee6;color:#fff}.item-select.item-calm .input-label,.item-select.item-calm:after{color:#fff}.item-select.item-assertive select{background:#ef4e3a;color:#fff}.item-select.item-assertive .input-label,.item-select.item-assertive:after{color:#fff}.item-select.item-balanced select{background:#6c3;color:#fff}.item-select.item-balanced .input-label,.item-select.item-balanced:after{color:#fff}.item-select.item-energized select{background:#f0b840;color:#fff}.item-select.item-energized .input-label,.item-select.item-energized:after{color:#fff}.item-select.item-royal select{background:#8a6de9;color:#fff}.item-select.item-royal .input-label,.item-select.item-royal:after{color:#fff}.item-select.item-dark select{background:#444;color:#fff}.item-select.item-dark .input-label,.item-select.item-dark:after{color:#fff}select[multiple],select[size]{height:auto}progress{display:block;margin:15px auto;width:100%}.button{border-color:#b2b2b2;background-color:#f8f8f8;color:#444;position:relative;display:inline-block;margin:0;padding:0 12px;min-width:52px;min-height:47px;border-width:1px;border-style:solid;border-radius:2px;vertical-align:top;text-align:center;text-overflow:ellipsis;font-size:16px;line-height:42px;cursor:pointer}.button:hover{color:#444;text-decoration:none}.button.activated,.button.active{border-color:#a2a2a2;background-color:#e5e5e5;box-shadow:inset 0 1px 3px rgba(0,0,0,.15)}.button:after{position:absolute;top:-6px;right:-6px;bottom:-6px;left:-6px;content:' '}.button .icon{vertical-align:top;pointer-events:none}.button .icon:before,.button.icon-left:before,.button.icon-right:before,.button.icon:before{display:inline-block;padding:0 0 1px;vertical-align:inherit;font-size:24px;line-height:41px;pointer-events:none}.button.icon-left:before{float:left;padding-right:.2em;padding-left:0}.button.icon-right:before{float:right;padding-right:0;padding-left:.2em}.button.button-block,.button.button-full{margin-top:10px;margin-bottom:10px}.button.button-light{border-color:#ddd;background-color:#fff;color:#444}.button.button-light:hover{color:#444;text-decoration:none}.button.button-light.activated,.button.button-light.active{border-color:#ccc;background-color:#fafafa;box-shadow:inset 0 1px 3px rgba(0,0,0,.15)}.button.button-light.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#ddd}.button.button-light.button-icon{border-color:transparent;background:0 0}.button.button-light.button-outline{border-color:#ddd;background:0 0;color:#ddd}.button.button-light.button-outline.activated,.button.button-light.button-outline.active{background-color:#ddd;box-shadow:none;color:#fff}.button.button-stable{border-color:#b2b2b2;background-color:#f8f8f8;color:#444}.button.button-stable:hover{color:#444;text-decoration:none}.button.button-stable.activated,.button.button-stable.active{border-color:#a2a2a2;background-color:#e5e5e5;box-shadow:inset 0 1px 3px rgba(0,0,0,.15)}.button.button-stable.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#b2b2b2}.button.button-stable.button-icon{border-color:transparent;background:0 0}.button.button-stable.button-outline{border-color:#b2b2b2;background:0 0;color:#b2b2b2}.button.button-stable.button-outline.activated,.button.button-stable.button-outline.active{background-color:#b2b2b2;box-shadow:none;color:#fff}.button.button-positive{border-color:#145fd7;background-color:#4a87ee;color:#fff}.button.button-positive:hover{color:#fff;text-decoration:none}.button.button-positive.activated,.button.button-positive.active{border-color:#145fd7;background-color:#145fd7;box-shadow:inset 0 1px 3px rgba(0,0,0,.15)}.button.button-positive.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#4a87ee}.button.button-positive.button-icon{border-color:transparent;background:0 0}.button.button-positive.button-outline{border-color:#4a87ee;background:0 0;color:#4a87ee}.button.button-positive.button-outline.activated,.button.button-positive.button-outline.active{background-color:#4a87ee;box-shadow:none;color:#fff}.button.button-calm{border-color:#1aacc3;background-color:#43cee6;color:#fff}.button.button-calm:hover{color:#fff;text-decoration:none}.button.button-calm.activated,.button.button-calm.active{border-color:#1aacc3;background-color:#1aacc3;box-shadow:inset 0 1px 3px rgba(0,0,0,.15)}.button.button-calm.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#43cee6}.button.button-calm.button-icon{border-color:transparent;background:0 0}.button.button-calm.button-outline{border-color:#43cee6;background:0 0;color:#43cee6}.button.button-calm.button-outline.activated,.button.button-calm.button-outline.active{background-color:#43cee6;box-shadow:none;color:#fff}.button.button-assertive{border-color:#cc2311;background-color:#ef4e3a;color:#fff}.button.button-assertive:hover{color:#fff;text-decoration:none}.button.button-assertive.activated,.button.button-assertive.active{border-color:#cc2311;background-color:#cc2311;box-shadow:inset 0 1px 3px rgba(0,0,0,.15)}.button.button-assertive.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#ef4e3a}.button.button-assertive.button-icon{border-color:transparent;background:0 0}.button.button-assertive.button-outline{border-color:#ef4e3a;background:0 0;color:#ef4e3a}.button.button-assertive.button-outline.activated,.button.button-assertive.button-outline.active{background-color:#ef4e3a;box-shadow:none;color:#fff}.button.button-balanced{border-color:#498f24;background-color:#6c3;color:#fff}.button.button-balanced:hover{color:#fff;text-decoration:none}.button.button-balanced.activated,.button.button-balanced.active{border-color:#498f24;background-color:#498f24;box-shadow:inset 0 1px 3px rgba(0,0,0,.15)}.button.button-balanced.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#6c3}.button.button-balanced.button-icon{border-color:transparent;background:0 0}.button.button-balanced.button-outline{border-color:#6c3;background:0 0;color:#6c3}.button.button-balanced.button-outline.activated,.button.button-balanced.button-outline.active{background-color:#6c3;box-shadow:none;color:#fff}.button.button-energized{border-color:#d39211;background-color:#f0b840;color:#fff}.button.button-energized:hover{color:#fff;text-decoration:none}.button.button-energized.activated,.button.button-energized.active{border-color:#d39211;background-color:#d39211;box-shadow:inset 0 1px 3px rgba(0,0,0,.15)}.button.button-energized.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#f0b840}.button.button-energized.button-icon{border-color:transparent;background:0 0}.button.button-energized.button-outline{border-color:#f0b840;background:0 0;color:#f0b840}.button.button-energized.button-outline.activated,.button.button-energized.button-outline.active{background-color:#f0b840;box-shadow:none;color:#fff}.button.button-royal{border-color:#552bdf;background-color:#8a6de9;color:#fff}.button.button-royal:hover{color:#fff;text-decoration:none}.button.button-royal.activated,.button.button-royal.active{border-color:#552bdf;background-color:#552bdf;box-shadow:inset 0 1px 3px rgba(0,0,0,.15)}.button.button-royal.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#8a6de9}.button.button-royal.button-icon{border-color:transparent;background:0 0}.button.button-royal.button-outline{border-color:#8a6de9;background:0 0;color:#8a6de9}.button.button-royal.button-outline.activated,.button.button-royal.button-outline.active{background-color:#8a6de9;box-shadow:none;color:#fff}.button.button-dark{border-color:#111;background-color:#444;color:#fff}.button.button-dark:hover{color:#fff;text-decoration:none}.button.button-dark.activated,.button.button-dark.active{border-color:#000;background-color:#262626;box-shadow:inset 0 1px 3px rgba(0,0,0,.15)}.button.button-dark.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#444}.button.button-dark.button-icon{border-color:transparent;background:0 0}.button.button-dark.button-outline{border-color:#444;background:0 0;color:#444}.button.button-dark.button-outline.activated,.button.button-dark.button-outline.active{background-color:#444;box-shadow:none;color:#fff}.button-small{padding:2px 4px 1px;min-width:28px;min-height:30px;font-size:12px;line-height:26px}.button-small .icon:before,.button-small.icon-left:before,.button-small.icon-right:before,.button-small.icon:before{font-size:16px;line-height:19px;margin-top:3px}.button-large{padding:0 16px;min-width:68px;min-height:59px;font-size:20px;line-height:53px}.button-large .icon:before,.button-large.icon-left:before,.button-large.icon-right:before,.button-large.icon:before{padding-bottom:2px;font-size:32px;line-height:51px}.button-icon{-webkit-transition:opacity .1s;-moz-transition:opacity .1s;transition:opacity .1s;padding:0 6px;min-width:initial;border-color:transparent;background:0 0}.button-icon.button.activated,.button-icon.button.active{border-color:transparent;background:0 0;box-shadow:none;opacity:.3}.button-icon .icon:before,.button-icon.icon:before{font-size:32px}.button-clear{-webkit-transition:opacity .1s;-moz-transition:opacity .1s;transition:opacity .1s;padding:0 6px;max-height:42px;border-color:transparent;background:0 0;box-shadow:none}.button-clear.button-clear{border-color:transparent;background:0 0;box-shadow:none;color:#b2b2b2}.button-clear.button-icon{border-color:transparent;background:0 0}.button-clear.activated,.button-clear.active{opacity:.3}.button-outline{-webkit-transition:opacity .1s;-moz-transition:opacity .1s;transition:opacity .1s;background:0 0;box-shadow:none}.button-outline.button-outline{border-color:#b2b2b2;background:0 0;color:#b2b2b2}.button-outline.button-outline.activated,.button-outline.button-outline.active{background-color:#b2b2b2;box-shadow:none;color:#fff}.padding>.button.button-block:first-child{margin-top:0}.button-block{display:block;clear:both}.button-block:after{clear:both}.button-full,.button-full>.button{display:block;margin-right:0;margin-left:0;border-right-width:0;border-left-width:0;border-radius:0}.button-full>button.button,button.button-block,button.button-full,input.button.button-block{width:100%}a.button{text-decoration:none}.button.disabled,.button[disabled]{opacity:.4;cursor:default!important;pointer-events:none}.button-bar{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;width:100%}.button-bar.button-bar-inline{display:block;width:auto}.button-bar.button-bar-inline:after,.button-bar.button-bar-inline:before{display:table;content:"";line-height:0}.button-bar.button-bar-inline:after{clear:both}.button-bar.button-bar-inline>.button{width:auto;display:inline-block;float:left}.button-bar>.button{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;overflow:hidden;padding:0 16px;width:0;border-width:1px 0 1px 1px;border-radius:0;text-align:center;text-overflow:ellipsis;white-space:nowrap}.button-bar>.button .icon:before,.button-bar>.button:before{line-height:44px}.button-bar>.button:first-child{border-radius:2px 0 0 2px}.button-bar>.button:last-child{border-right-width:1px;border-radius:0 2px 2px 0}@-webkit-keyframes slideInUp{0%{-webkit-transform:translate3d(0,100%,0)}100%{-webkit-transform:translate3d(0,0,0)}}@-moz-keyframes slideInUp{0%{-moz-transform:translate3d(0,100%,0)}100%{-moz-transform:translate3d(0,0,0)}}@keyframes slideInUp{0%{transform:translate3d(0,100%,0)}100%{transform:translate3d(0,0,0)}}@-webkit-keyframes slideOutUp{0%{-webkit-transform:translate3d(0,0,0)}100%{-webkit-transform:translate3d(0,100%,0)}}@-moz-keyframes slideOutUp{0%{-moz-transform:translate3d(0,0,0)}100%{-moz-transform:translate3d(0,100%,0)}}@keyframes slideOutUp{0%{transform:translate3d(0,0,0)}100%{transform:translate3d(0,100%,0)}}@-webkit-keyframes slideInFromLeft{from{-webkit-transform:translate3d(-100%,0,0)}to{-webkit-transform:translate3d(0,0,0)}}@-moz-keyframes slideInFromLeft{from{-moz-transform:translateX(-100%)}to{-moz-transform:translateX(0)}}@keyframes slideInFromLeft{from{transform:translateX(-100%)}to{transform:translateX(0)}}@-webkit-keyframes slideInFromRight{from{-webkit-transform:translate3d(100%,0,0)}to{-webkit-transform:translate3d(0,0,0)}}@-moz-keyframes slideInFromRight{from{-moz-transform:translateX(100%)}to{-moz-transform:translateX(0)}}@keyframes slideInFromRight{from{transform:translateX(100%)}to{transform:translateX(0)}}@-webkit-keyframes slideOutToLeft{from{-webkit-transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(-100%,0,0)}}@-moz-keyframes slideOutToLeft{from{-moz-transform:translateX(0)}to{-moz-transform:translateX(-100%)}}@keyframes slideOutToLeft{from{transform:translateX(0)}to{transform:translateX(-100%)}}@-webkit-keyframes slideOutToRight{from{-webkit-transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(100%,0,0)}}@-moz-keyframes slideOutToRight{from{-moz-transform:translateX(0)}to{-moz-transform:translateX(100%)}}@keyframes slideOutToRight{from{transform:translateX(0)}to{transform:translateX(100%)}}@-webkit-keyframes fadeOut{from{opacity:1}to{opacity:0}}@-moz-keyframes fadeOut{from{opacity:1}to{opacity:0}}@keyframes fadeOut{from{opacity:1}to{opacity:0}}@-webkit-keyframes fadeIn{from{opacity:0}to{opacity:1}}@-moz-keyframes fadeIn{from{opacity:0}to{opacity:1}}@keyframes fadeIn{from{opacity:0}to{opacity:1}}@-webkit-keyframes fadeInHalf{from{background-color:rgba(0,0,0,0)}to{background-color:rgba(0,0,0,.5)}}@-moz-keyframes fadeInHalf{from{background-color:rgba(0,0,0,0)}to{background-color:rgba(0,0,0,.5)}}@keyframes fadeInHalf{from{background-color:rgba(0,0,0,0)}to{background-color:rgba(0,0,0,.5)}}@-webkit-keyframes fadeOutHalf{from{background-color:rgba(0,0,0,.5)}to{background-color:rgba(0,0,0,0)}}@-moz-keyframes fadeOutHalf{from{background-color:rgba(0,0,0,.5)}to{background-color:rgba(0,0,0,0)}}@keyframes fadeOutHalf{from{background-color:rgba(0,0,0,.5)}to{background-color:transparent}}@-webkit-keyframes scaleOut{from{-webkit-transform:scale(1);opacity:1}to{-webkit-transform:scale(0.8);opacity:0}}@-moz-keyframes scaleOut{from{-moz-transform:scale(1);opacity:1}to{-moz-transform:scale(0.8);opacity:0}}@keyframes scaleOut{from{transform:scale(1);opacity:1}to{transform:scale(0.8);opacity:0}}@-webkit-keyframes scaleIn{from{-webkit-transform:scale(0)}to{-webkit-transform:scale(1)}}@-moz-keyframes scaleIn{from{-moz-transform:scale(0)}to{-moz-transform:scale(1)}}@keyframes scaleIn{from{transform:scale(0)}to{transform:scale(1)}}@-webkit-keyframes superScaleIn{from{-webkit-transform:scale(1.2);opacity:0}to{-webkit-transform:scale(1);opacity:1}}@-moz-keyframes superScaleIn{from{-moz-transform:scale(1.2);opacity:0}to{-moz-transform:scale(1);opacity:1}}@keyframes superScaleIn{from{transform:scale(1.2);opacity:0}to{transform:scale(1);opacity:1}}@-webkit-keyframes spin{100%{-webkit-transform:rotate(360deg)}}@-moz-keyframes spin{100%{-moz-transform:rotate(360deg)}}@keyframes spin{100%{transform:rotate(360deg)}}.no-animation.ng-enter,.no-animation.ng-leave,.no-animation>.ng-enter,.no-animation>.ng-leave{-webkit-transition:none;-moz-transition:none;transition:none}.noop-animation.ng-enter,.noop-animation.ng-leave,.noop-animation>.ng-enter,.noop-animation>.ng-leave{-webkit-transition:all cubic-bezier(0.25,.46,.45,.94) 250ms;-moz-transition:all cubic-bezier(0.25,.46,.45,.94) 250ms;transition:all cubic-bezier(0.25,.46,.45,.94) 250ms;position:absolute;top:0;right:0;bottom:0;left:0}.ng-animate .pane{position:absolute}.slide-left-right.ng-enter,.slide-left-right.ng-leave,.slide-left-right>.ng-enter,.slide-left-right>.ng-leave,.slide-right-left.reverse.ng-enter,.slide-right-left.reverse.ng-leave,.slide-right-left.reverse>.ng-enter,.slide-right-left.reverse>.ng-leave{-webkit-transition:all ease-in-out 250ms;-moz-transition:all ease-in-out 250ms;transition:all ease-in-out 250ms;position:absolute;top:0;right:0;bottom:0;left:0}.slide-left-right.ng-enter,.slide-left-right>.ng-enter,.slide-right-left.reverse.ng-enter,.slide-right-left.reverse>.ng-enter{-webkit-transform:translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.slide-left-right.ng-enter.ng-enter-active,.slide-left-right>.ng-enter.ng-enter-active,.slide-right-left.reverse.ng-enter.ng-enter-active,.slide-right-left.reverse>.ng-enter.ng-enter-active{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.slide-left-right.ng-leave.ng-leave-active,.slide-left-right>.ng-leave.ng-leave-active,.slide-right-left.reverse.ng-leave.ng-leave-active,.slide-right-left.reverse>.ng-leave.ng-leave-active{-webkit-transform:translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.slide-left-right.reverse.ng-enter,.slide-left-right.reverse.ng-leave,.slide-left-right.reverse>.ng-enter,.slide-left-right.reverse>.ng-leave,.slide-right-left.ng-enter,.slide-right-left.ng-leave,.slide-right-left>.ng-enter,.slide-right-left>.ng-leave{-webkit-transition:all ease-in-out 250ms;-moz-transition:all ease-in-out 250ms;transition:all ease-in-out 250ms;position:absolute;top:0;right:0;bottom:0;left:0}.slide-left-right.reverse.ng-enter,.slide-left-right.reverse>.ng-enter,.slide-right-left.ng-enter,.slide-right-left>.ng-enter{-webkit-transform:translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.slide-left-right.reverse.ng-enter.ng-enter-active,.slide-left-right.reverse>.ng-enter.ng-enter-active,.slide-right-left.ng-enter.ng-enter-active,.slide-right-left>.ng-enter.ng-enter-active{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.slide-left-right.reverse.ng-leave.ng-leave-active,.slide-left-right.reverse>.ng-leave.ng-leave-active,.slide-right-left.ng-leave.ng-leave-active,.slide-right-left>.ng-leave.ng-leave-active{-webkit-transform:translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.slide-left-right-ios7.ng-enter,.slide-left-right-ios7.ng-leave,.slide-left-right-ios7>.ng-enter,.slide-left-right-ios7>.ng-leave,.slide-right-left-ios7.reverse.ng-enter,.slide-right-left-ios7.reverse.ng-leave,.slide-right-left-ios7.reverse>.ng-enter,.slide-right-left-ios7.reverse>.ng-leave{-webkit-transition:all cubic-bezier(0.4,.6,.2,1) 340ms;-moz-transition:all cubic-bezier(0.4,.6,.2,1) 340ms;transition:all cubic-bezier(0.4,.6,.2,1) 340ms;position:absolute;top:0;right:-1px;bottom:0;left:-1px;width:auto;border-right:none;border-left:none}.slide-left-right-ios7.ng-enter:not(.bar),.slide-left-right-ios7.ng-leave:not(.bar),.slide-left-right-ios7>.ng-enter:not(.bar),.slide-left-right-ios7>.ng-leave:not(.bar),.slide-right-left-ios7.reverse.ng-enter:not(.bar),.slide-right-left-ios7.reverse.ng-leave:not(.bar),.slide-right-left-ios7.reverse>.ng-enter:not(.bar),.slide-right-left-ios7.reverse>.ng-leave:not(.bar){border-right:none;border-left:none}.slide-left-right-ios7.ng-enter,.slide-left-right-ios7>.ng-enter,.slide-right-left-ios7.reverse.ng-enter,.slide-right-left-ios7.reverse>.ng-enter{-webkit-transform:translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.slide-left-right-ios7.ng-leave,.slide-left-right-ios7>.ng-leave,.slide-right-left-ios7.reverse.ng-leave,.slide-right-left-ios7.reverse>.ng-leave{z-index:1}.slide-left-right-ios7.ng-enter.ng-enter-active,.slide-left-right-ios7>.ng-enter.ng-enter-active,.slide-right-left-ios7.reverse.ng-enter.ng-enter-active,.slide-right-left-ios7.reverse>.ng-enter.ng-enter-active{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.slide-left-right-ios7.ng-leave.ng-leave-active,.slide-left-right-ios7>.ng-leave.ng-leave-active,.slide-right-left-ios7.reverse.ng-leave.ng-leave-active,.slide-right-left-ios7.reverse>.ng-leave.ng-leave-active{-webkit-transform:translate3d(-15%,0,0);-moz-transform:translate3d(-15%,0,0);transform:translate3d(-15%,0,0)}.slide-left-right-ios7.reverse.ng-enter,.slide-left-right-ios7.reverse.ng-leave,.slide-left-right-ios7.reverse>.ng-enter,.slide-left-right-ios7.reverse>.ng-leave,.slide-right-left-ios7.ng-enter,.slide-right-left-ios7.ng-leave,.slide-right-left-ios7>.ng-enter,.slide-right-left-ios7>.ng-leave{-webkit-transition:all cubic-bezier(0.4,.6,.2,1) 340ms;-moz-transition:all cubic-bezier(0.4,.6,.2,1) 340ms;transition:all cubic-bezier(0.4,.6,.2,1) 340ms;position:absolute;top:0;right:-1px;bottom:0;left:-1px;width:auto;border-right:none;border-left:none}.slide-left-right-ios7.reverse.ng-enter,.slide-left-right-ios7.reverse>.ng-enter,.slide-right-left-ios7.ng-enter,.slide-right-left-ios7>.ng-enter{-webkit-transform:translate3d(-15%,0,0);-moz-transform:translate3d(-15%,0,0);transform:translate3d(-15%,0,0)}.slide-left-right-ios7.reverse.ng-leave,.slide-left-right-ios7.reverse>.ng-leave,.slide-right-left-ios7.ng-leave,.slide-right-left-ios7>.ng-leave{z-index:2}.slide-left-right-ios7.reverse.ng-enter.ng-enter-active,.slide-left-right-ios7.reverse>.ng-enter.ng-enter-active,.slide-right-left-ios7.ng-enter.ng-enter-active,.slide-right-left-ios7>.ng-enter.ng-enter-active{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.slide-left-right-ios7.reverse.ng-leave.ng-leave-active,.slide-left-right-ios7.reverse>.ng-leave.ng-leave-active,.slide-right-left-ios7.ng-leave.ng-leave-active,.slide-right-left-ios7>.ng-leave.ng-leave-active{-webkit-transform:translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.grade-a.platform-ipad .slide-left-right-ios7.ng-enter,.grade-a.platform-ipad .slide-left-right-ios7.reverse.ng-leave,.grade-a.platform-ipad .slide-left-right-ios7.reverse>.ng-leave,.grade-a.platform-ipad .slide-left-right-ios7>.ng-enter,.grade-a.platform-ipad .slide-right-left-ios7.ng-leave,.grade-a.platform-ipad .slide-right-left-ios7.reverse.ng-enter,.grade-a.platform-ipad .slide-right-left-ios7.reverse>.ng-enter,.grade-a.platform-ipad .slide-right-left-ios7>.ng-leave{border-left:1px solid #ddd}.fade-explode.ng-enter,.fade-explode.ng-leave,.fade-explode>.ng-enter,.fade-explode>.ng-leave{-webkit-transition:all ease-out 300ms;-moz-transition:all ease-out 300ms;transition:all ease-out 300ms;position:absolute;top:0;right:-1px;bottom:0;left:-1px;width:auto}.fade-explode.ng-enter:not(.bar),.fade-explode.ng-leave:not(.bar),.fade-explode>.ng-enter:not(.bar),.fade-explode>.ng-leave:not(.bar){border-right:1px solid #ddd;border-left:1px solid #ddd}.fade-explode.ng-enter,.fade-explode>.ng-enter{-webkit-transform:scale(1.6);-moz-transform:scale(1.6);transform:scale(1.6);opacity:0;z-index:2}.fade-explode.ng-leave,.fade-explode>.ng-leave{z-index:1}.fade-explode.ng-enter.ng-enter-active,.fade-explode>.ng-enter.ng-enter-active{-webkit-transform:scale(1);-moz-transform:scale(1);transform:scale(1);opacity:1}.fade-explode.ng-leave.ng-leave-active,.fade-explode>.ng-leave.ng-leave-active{-webkit-transform:scale(0.95);-moz-transform:scale(0.95);transform:scale(0.95)}.fade-explode.reverse.ng-enter,.fade-explode.reverse.ng-leave,.fade-explode.reverse>.ng-enter,.fade-explode.reverse>.ng-leave{-webkit-transition:all ease-out 300ms;-moz-transition:all ease-out 300ms;transition:all ease-out 300ms;position:absolute;top:0;right:-1px;bottom:0;left:-1px;width:auto}.fade-explode.reverse.ng-enter:not(.bar),.fade-explode.reverse.ng-leave:not(.bar),.fade-explode.reverse>.ng-enter:not(.bar),.fade-explode.reverse>.ng-leave:not(.bar){border-right:1px solid #ddd;border-left:1px solid #ddd}.fade-explode.reverse.ng-enter,.fade-explode.reverse>.ng-enter{-webkit-transform:scale(0.95);-moz-transform:scale(0.95);transform:scale(0.95);opacity:0;z-index:1}.fade-explode.reverse.ng-leave,.fade-explode.reverse>.ng-leave{-webkit-transform:scale(1);-moz-transform:scale(1);transform:scale(1);opacity:1;z-index:2}.fade-explode.reverse.ng-enter.ng-enter-active,.fade-explode.reverse>.ng-enter.ng-enter-active{-webkit-transform:scale(1);-moz-transform:scale(1);transform:scale(1);opacity:1}.fade-explode.reverse.ng-leave.ng-leave-active,.fade-explode.reverse>.ng-leave.ng-leave-active{-webkit-transform:scale(1.6);-moz-transform:scale(1.6);transform:scale(1.6);opacity:0}.fade-implode.ng-enter,.fade-implode.ng-leave,.fade-implode>.ng-enter,.fade-implode>.ng-leave{-webkit-transition:all ease-out 200ms;-moz-transition:all ease-out 200ms;transition:all ease-out 200ms;position:absolute;top:0;right:-1px;bottom:0;left:-1px;width:auto}.fade-implode.ng-enter:not(.bar),.fade-implode.ng-leave:not(.bar),.fade-implode>.ng-enter:not(.bar),.fade-implode>.ng-leave:not(.bar){border-right:1px solid #ddd;border-left:1px solid #ddd}.fade-implode.ng-enter,.fade-implode>.ng-enter{-webkit-transform:scale(0.8);-moz-transform:scale(0.8);transform:scale(0.8);opacity:0;z-index:2}.fade-implode.ng-leave,.fade-implode>.ng-leave{z-index:1}.fade-implode.ng-enter.ng-enter-active,.fade-implode>.ng-enter.ng-enter-active{-webkit-transform:scale(1);-moz-transform:scale(1);transform:scale(1);opacity:1}.fade-implode.reverse.ng-enter,.fade-implode.reverse.ng-leave,.fade-implode.reverse>.ng-enter,.fade-implode.reverse>.ng-leave{-webkit-transition:all ease-out 200ms;-moz-transition:all ease-out 200ms;transition:all ease-out 200ms;position:absolute;top:0;right:-1px;bottom:0;left:-1px;width:auto;border-right:1px solid #ddd;border-left:1px solid #ddd}.fade-implode.reverse.ng-enter,.fade-implode.reverse>.ng-enter{-webkit-transform:scale(1);-moz-transform:scale(1);transform:scale(1);opacity:1;z-index:1}.fade-implode.reverse.ng-leave,.fade-implode.reverse>.ng-leave{-webkit-transform:scale(1);-moz-transform:scale(1);transform:scale(1);opacity:1;z-index:2}.fade-implode.reverse.ng-enter.ng-enter-active,.fade-implode.reverse>.ng-enter.ng-enter-active{opacity:1}.fade-implode.reverse.ng-leave.ng-leave-active,.fade-implode.reverse>.ng-leave.ng-leave-active{-webkit-transform:scale(0.8);-moz-transform:scale(0.8);transform:scale(0.8);opacity:0}.slide-in-left{-webkit-transform:translate3d(0%,0,0);-moz-transform:translate3d(0%,0,0);transform:translate3d(0%,0,0)}.slide-in-left.ng-enter,.slide-in-left>.ng-enter{-webkit-animation-name:slideInFromLeft;-moz-animation-name:slideInFromLeft;animation-name:slideInFromLeft;-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-in-left.ng-leave,.slide-in-left>.ng-leave{-webkit-animation-name:slideOutToLeft;-moz-animation-name:slideOutToLeft;animation-name:slideOutToLeft;-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-in-left-add{-webkit-transform:translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-in-left-add-active{-webkit-animation-name:slideInFromLeft;-moz-animation-name:slideInFromLeft;animation-name:slideInFromLeft}.slide-out-left{-webkit-transform:translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.slide-out-left.ng-enter,.slide-out-left.ng-leave,.slide-out-left>.ng-enter,.slide-out-left>.ng-leave{-webkit-animation-name:slideOutToLeft;-moz-animation-name:slideOutToLeft;animation-name:slideOutToLeft;-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-out-left-add{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-out-left-add-active{-webkit-animation-name:slideOutToLeft;-moz-animation-name:slideOutToLeft;animation-name:slideOutToLeft}.slide-in-right{-webkit-transform:translate3d(0%,0,0);-moz-transform:translate3d(0%,0,0);transform:translate3d(0%,0,0)}.slide-in-right.ng-enter,.slide-in-right>.ng-enter{-webkit-animation-name:slideInFromRight;-moz-animation-name:slideInFromRight;animation-name:slideInFromRight;-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-in-right.ng-leave,.slide-in-right>.ng-leave{-webkit-animation-name:slideOutToRight;-moz-animation-name:slideOutToRight;animation-name:slideOutToRight;-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-in-right-add{-webkit-transform:translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-in-right-add-active{-webkit-animation-name:slideInFromRight;-moz-animation-name:slideInFromRight;animation-name:slideInFromRight}.slide-out-right{-webkit-transform:translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.slide-out-right.ng-enter,.slide-out-right.ng-leave,.slide-out-right>.ng-enter,.slide-out-right>.ng-leave{-webkit-animation-name:slideOutToRight;-moz-animation-name:slideOutToRight;animation-name:slideOutToRight;-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-out-right-add{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-out-right-add-active{-webkit-animation-name:slideOutToRight;-moz-animation-name:slideOutToRight;animation-name:slideOutToRight}.slide-in-up{-webkit-transform:translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.slide-in-up.ng-enter,.slide-in-up>.ng-enter{-webkit-transition:all cubic-bezier(0.1,.7,.1,1) 400ms;-moz-transition:all cubic-bezier(0.1,.7,.1,1) 400ms;transition:all cubic-bezier(0.1,.7,.1,1) 400ms}.slide-in-up.ng-enter-active,.slide-in-up>.ng-enter-active{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.slide-in-up.ng-leave,.slide-in-up>.ng-leave{-webkit-transition:all ease-in-out 250ms;-moz-transition:all ease-in-out 250ms;transition:all ease-in-out 250ms}.fade-in{-webkit-animation:fadeOut .3s;-moz-animation:fadeOut .3s;animation:fadeOut .3s}.fade-in.active{-webkit-animation:fadeIn .3s;-moz-animation:fadeIn .3s;animation:fadeIn .3s}.fade-in-not-out .ng-enter,.fade-in-not-out.ng-enter{-webkit-animation:fadeIn .3s;-moz-animation:fadeIn .3s;animation:fadeIn .3s;position:relative}.fade-in-not-out .ng-leave,.fade-in-not-out.ng-leave{display:none}.nav-title-slide-ios7:not(.no-animation) .button.back-button{-webkit-transition:all 340ms;-moz-transition:all 340ms;transition:all 340ms;-webkit-transition-timing-function:cubic-bezier(0.4,.6,.2,1);-moz-transition-timing-function:cubic-bezier(0.4,.6,.2,1);transition-timing-function:cubic-bezier(0.4,.6,.2,1);-webkit-transform:translate3d(0%,0,0);-moz-transform:translate3d(0%,0,0);transform:translate3d(0%,0,0);opacity:1}.nav-title-slide-ios7:not(.no-animation) .button.back-button.activated,.nav-title-slide-ios7:not(.no-animation) .button.back-button.active{opacity:.5}.nav-title-slide-ios7:not(.no-animation) .button.back-button.ng-hide{opacity:0;-webkit-transform:translate3d(30%,0,0);-moz-transform:translate3d(30%,0,0);transform:translate3d(30%,0,0)}.nav-title-slide-ios7:not(.no-animation) .button.back-button.ng-hide-add,.nav-title-slide-ios7:not(.no-animation) .button.back-button.ng-hide-remove{display:block!important}.nav-title-slide-ios7:not(.no-animation) .button.back-button.ng-hide-add{position:absolute}.nav-title-slide-ios7.ng-enter,.nav-title-slide-ios7.ng-leave,.nav-title-slide-ios7>.ng-enter,.nav-title-slide-ios7>.ng-leave{-webkit-transition:all 340ms;-moz-transition:all 340ms;transition:all 340ms;-webkit-transition-timing-function:cubic-bezier(0.4,.6,.2,1);-moz-transition-timing-function:cubic-bezier(0.4,.6,.2,1);transition-timing-function:cubic-bezier(0.4,.6,.2,1);opacity:1}.nav-title-slide-ios7.ng-enter,.nav-title-slide-ios7>.ng-enter{-webkit-transform:translate3d(30%,0,0);-moz-transform:translate3d(30%,0,0);transform:translate3d(30%,0,0);opacity:0}.nav-title-slide-ios7.ng-enter.title,.nav-title-slide-ios7>.ng-enter.title{-webkit-transform:translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.nav-title-slide-ios7.ng-enter.ng-enter-active,.nav-title-slide-ios7>.ng-enter.ng-enter-active{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.nav-title-slide-ios7.ng-leave.ng-leave-active,.nav-title-slide-ios7>.ng-leave.ng-leave-active{-webkit-transform:translate3d(-30%,0,0);-moz-transform:translate3d(-30%,0,0);transform:translate3d(-30%,0,0);opacity:0}.nav-title-slide-ios7.reverse.ng-enter,.nav-title-slide-ios7.reverse.ng-leave,.nav-title-slide-ios7.reverse>.ng-enter,.nav-title-slide-ios7.reverse>.ng-leave{-webkit-transition:all 340ms;-moz-transition:all 340ms;transition:all 340ms;-webkit-transition-timing-function:cubic-bezier(0.4,.6,.2,1);-moz-transition-timing-function:cubic-bezier(0.4,.6,.2,1);transition-timing-function:cubic-bezier(0.4,.6,.2,1);opacity:1}.nav-title-slide-ios7.reverse.ng-enter,.nav-title-slide-ios7.reverse>.ng-enter{-webkit-transform:translate3d(-30%,0,0);-moz-transform:translate3d(-30%,0,0);transform:translate3d(-30%,0,0);opacity:0}.nav-title-slide-ios7.reverse.ng-enter.ng-enter-active,.nav-title-slide-ios7.reverse>.ng-enter.ng-enter-active{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.nav-title-slide-ios7.reverse.ng-leave.ng-leave-active,.nav-title-slide-ios7.reverse>.ng-leave.ng-leave-active{-webkit-transform:translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);opacity:0}.nav-title-android:not(.no-animation) .button.back-button{-webkit-transition:all 200ms;-moz-transition:all 200ms;transition:all 200ms;-webkit-transition-timing-function:linear;-moz-transition-timing-function:linear;transition-timing-function:linear;opacity:1}.nav-title-android:not(.no-animation) .button.back-button.ng-hide{opacity:0}.nav-title-android:not(.no-animation) .button.back-button.ng-hide-add,.nav-title-android:not(.no-animation) .button.back-button.ng-hide-remove{display:block!important}.nav-title-android:not(.no-animation) .button.back-button.ng-hide-add{position:absolute}.nav-title-android.ng-enter,.nav-title-android.ng-leave,.nav-title-android>.ng-enter,.nav-title-android>.ng-leave{-webkit-transition:all 200ms;-moz-transition:all 200ms;transition:all 200ms;-webkit-transition-timing-function:linear;-moz-transition-timing-function:linear;transition-timing-function:linear}.nav-title-android.ng-enter,.nav-title-android>.ng-enter{opacity:0}.nav-title-android.ng-enter.ng-enter-active,.nav-title-android>.ng-enter.ng-enter-active{opacity:1}.nav-title-android.ng-leave.ng-leave-active,.nav-title-android>.ng-leave.ng-leave-active{opacity:0}.row{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;padding:5px;width:100%}.row+.row{margin-top:-5px;padding-top:0}.col{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;padding:5px;width:100%}.row-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;-moz-align-items:flex-start;align-items:flex-start}.row-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;-moz-align-items:flex-end;align-items:flex-end}.row-center{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center}.row-stretch{-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;-moz-align-items:stretch;align-items:stretch}.row-baseline{-webkit-box-align:baseline;-ms-flex-align:baseline;-webkit-align-items:baseline;-moz-align-items:baseline;align-items:baseline}.col-top{-webkit-align-self:flex-start;-moz-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.col-bottom{-webkit-align-self:flex-end;-moz-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.col-center{-webkit-align-self:center;-moz-align-self:center;-ms-flex-item-align:center;align-self:center}.col-offset-10{margin-left:10%}.col-offset-20{margin-left:20%}.col-offset-25{margin-left:25%}.col-offset-33,.col-offset-34{margin-left:33.3333%}.col-offset-50{margin-left:50%}.col-offset-66,.col-offset-67{margin-left:66.6666%}.col-offset-75{margin-left:75%}.col-offset-80{margin-left:80%}.col-offset-90{margin-left:90%}.col-10{-webkit-box-flex:0;-webkit-flex:0 0 10%;-moz-box-flex:0;-moz-flex:0 0 10%;-ms-flex:0 0 10%;flex:0 0 10%;max-width:10%}.col-20{-webkit-box-flex:0;-webkit-flex:0 0 20%;-moz-box-flex:0;-moz-flex:0 0 20%;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.col-25{-webkit-box-flex:0;-webkit-flex:0 0 25%;-moz-box-flex:0;-moz-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-33,.col-34{-webkit-box-flex:0;-webkit-flex:0 0 33.3333%;-moz-box-flex:0;-moz-flex:0 0 33.3333%;-ms-flex:0 0 33.3333%;flex:0 0 33.3333%;max-width:33.3333%}.col-50{-webkit-box-flex:0;-webkit-flex:0 0 50%;-moz-box-flex:0;-moz-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-66,.col-67{-webkit-box-flex:0;-webkit-flex:0 0 66.6666%;-moz-box-flex:0;-moz-flex:0 0 66.6666%;-ms-flex:0 0 66.6666%;flex:0 0 66.6666%;max-width:66.6666%}.col-75{-webkit-box-flex:0;-webkit-flex:0 0 75%;-moz-box-flex:0;-moz-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-80{-webkit-box-flex:0;-webkit-flex:0 0 80%;-moz-box-flex:0;-moz-flex:0 0 80%;-ms-flex:0 0 80%;flex:0 0 80%;max-width:80%}.col-90{-webkit-box-flex:0;-webkit-flex:0 0 90%;-moz-box-flex:0;-moz-flex:0 0 90%;-ms-flex:0 0 90%;flex:0 0 90%;max-width:90%}@media (max-width:567px){.responsive-sm{-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.responsive-sm .col,.responsive-sm .col-10,.responsive-sm .col-20,.responsive-sm .col-25,.responsive-sm .col-33,.responsive-sm .col-34,.responsive-sm .col-50,.responsive-sm .col-66,.responsive-sm .col-67,.responsive-sm .col-75,.responsive-sm .col-80,.responsive-sm .col-90{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;margin-bottom:15px;margin-left:0;max-width:100%;width:100%}}@media (max-width:767px){.responsive-md{-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.responsive-md .col,.responsive-md .col-10,.responsive-md .col-20,.responsive-md .col-25,.responsive-md .col-33,.responsive-md .col-34,.responsive-md .col-50,.responsive-md .col-66,.responsive-md .col-67,.responsive-md .col-75,.responsive-md .col-80,.responsive-md .col-90{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;margin-bottom:15px;margin-left:0;max-width:100%;width:100%}}@media (max-width:1023px){.responsive-lg{-webkit-box-direction:normal;-moz-box-direction:normal;-webkit-box-orient:vertical;-moz-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.responsive-lg .col,.responsive-lg .col-10,.responsive-lg .col-20,.responsive-lg .col-25,.responsive-lg .col-33,.responsive-lg .col-34,.responsive-lg .col-50,.responsive-lg .col-66,.responsive-lg .col-67,.responsive-lg .col-75,.responsive-lg .col-80,.responsive-lg .col-90{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;margin-bottom:15px;margin-left:0;max-width:100%;width:100%}}.hide{display:none}.opacity-hide{opacity:0}.grade-b .opacity-hide,.grade-c .opacity-hide{opacity:1;display:none}.show{display:block}.opacity-show{opacity:1}.invisible{visibility:hidden}.keyboard-open .hide-on-keyboard-open{display:none}.keyboard-open .bar-footer.hide-on-keyboard-open+.pane .has-footer,.keyboard-open .tabs.hide-on-keyboard-open+.pane .has-tabs{bottom:0}.inline{display:inline-block}.disable-pointer-events{pointer-events:none}.enable-pointer-events{pointer-events:auto}.disable-user-behavior{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent;-webkit-user-drag:none;-ms-touch-action:none;-ms-content-zooming:none}.no-resize{resize:none}.block{display:block;clear:both}.block:after{display:block;visibility:hidden;clear:both;height:0;content:"."}.full-image{width:100%}.clearfix:after,.clearfix:before{display:table;content:"";line-height:0}.clearfix:after{clear:both}.padding{padding:10px}.padding-top,.padding-vertical{padding-top:10px}.padding-horizontal,.padding-right{padding-right:10px}.padding-bottom,.padding-vertical{padding-bottom:10px}.padding-horizontal,.padding-left{padding-left:10px}.rounded{border-radius:4px}.light,a.light{color:#fff}.light-bg{background-color:#fff}.light-border{border-color:#ddd}.stable,a.stable{color:#f8f8f8}.stable-bg{background-color:#f8f8f8}.stable-border{border-color:#b2b2b2}.positive,a.positive{color:#4a87ee}.positive-bg{background-color:#4a87ee}.positive-border{border-color:#145fd7}.calm,a.calm{color:#43cee6}.calm-bg{background-color:#43cee6}.calm-border{border-color:#1aacc3}.assertive,a.assertive{color:#ef4e3a}.assertive-bg{background-color:#ef4e3a}.assertive-border{border-color:#cc2311}.balanced,a.balanced{color:#6c3}.balanced-bg{background-color:#6c3}.balanced-border{border-color:#498f24}.energized,a.energized{color:#f0b840}.energized-bg{background-color:#f0b840}.energized-border{border-color:#d39211}.royal,a.royal{color:#8a6de9}.royal-bg{background-color:#8a6de9}.royal-border{border-color:#552bdf}.dark,a.dark{color:#444}.dark-bg{background-color:#444}.dark-border{border-color:#111}.roboto,.roboto input{font-family:Roboto,"Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif}.platform-ios.platform-cordova:not(.fullscreen) .bar-header:not(.bar-subheader){height:64px}.platform-ios.platform-cordova:not(.fullscreen) .bar-header:not(.bar-subheader).item-input-inset .item-input-wrapper{margin-top:19px!important}.platform-ios.platform-cordova:not(.fullscreen) .bar-header:not(.bar-subheader)>*{margin-top:20px}.platform-ios.platform-cordova:not(.fullscreen) .bar-subheader,.platform-ios.platform-cordova:not(.fullscreen) .has-header,.platform-ios.platform-cordova:not(.fullscreen) .tabs-top>.tabs,.platform-ios.platform-cordova:not(.fullscreen) .tabs.tabs-top{top:64px}.platform-ios.platform-cordova:not(.fullscreen) .has-subheader{top:108px}.platform-ios.platform-cordova:not(.fullscreen) .has-tabs-top{top:113px}.platform-ios.platform-cordova:not(.fullscreen) .has-header.has-subheader.has-tabs-top{top:157px}.platform-ios.platform-cordova.status-bar-hide{margin-bottom:20px}@media (orientation:landscape){.platform-ios.platform-browser.platform-ipad{position:fixed}}.platform-c:not(.enable-transitions) *{-webkit-transition:none!important;transition:none!important}
|
18
|
+
*/@font-face{font-family:Ionicons;src:url("<%= font_path('ionic/ionicons.eot') %>?v=1.4.0");src:url("<%= font_path('ionic/ionicons.eot') %>?v=1.4.0#iefix") format("embedded-opentype"),url("<%= font_path('ionic/ionicons.ttf') %>?v=1.4.0") format("truetype"),url("<%= font_path('ionic/ionicons.woff') %>?v=1.4.0") format("woff"),url("<%= font_path('ionic/ionicons.svg') %>?v=1.4.0#Ionicons") format("svg");font-weight:400;font-style:normal}.ion,.ion-alert,.ion-alert-circled,.ion-android-add,.ion-android-add-contact,.ion-android-alarm,.ion-android-archive,.ion-android-arrow-back,.ion-android-arrow-down-left,.ion-android-arrow-down-right,.ion-android-arrow-up-left,.ion-android-arrow-up-right,.ion-android-battery,.ion-android-book,.ion-android-calendar,.ion-android-call,.ion-android-camera,.ion-android-chat,.ion-android-checkmark,.ion-android-clock,.ion-android-close,.ion-android-contact,.ion-android-contacts,.ion-android-data,.ion-android-developer,.ion-android-display,.ion-android-download,.ion-android-dropdown,.ion-android-earth,.ion-android-folder,.ion-android-forums,.ion-android-friends,.ion-android-hand,.ion-android-image,.ion-android-inbox,.ion-android-information,.ion-android-keypad,.ion-android-lightbulb,.ion-android-locate,.ion-android-location,.ion-android-mail,.ion-android-microphone,.ion-android-mixer,.ion-android-more,.ion-android-note,.ion-android-playstore,.ion-android-printer,.ion-android-promotion,.ion-android-reminder,.ion-android-remove,.ion-android-search,.ion-android-send,.ion-android-settings,.ion-android-share,.ion-android-social,.ion-android-social-user,.ion-android-sort,.ion-android-star,.ion-android-stopwatch,.ion-android-storage,.ion-android-system-back,.ion-android-system-home,.ion-android-system-windows,.ion-android-timer,.ion-android-trash,.ion-android-volume,.ion-android-wifi,.ion-archive,.ion-arrow-down-a,.ion-arrow-down-b,.ion-arrow-down-c,.ion-arrow-expand,.ion-arrow-graph-down-left,.ion-arrow-graph-down-right,.ion-arrow-graph-up-left,.ion-arrow-graph-up-right,.ion-arrow-left-a,.ion-arrow-left-b,.ion-arrow-left-c,.ion-arrow-move,.ion-arrow-resize,.ion-arrow-return-left,.ion-arrow-return-right,.ion-arrow-right-a,.ion-arrow-right-b,.ion-arrow-right-c,.ion-arrow-shrink,.ion-arrow-swap,.ion-arrow-up-a,.ion-arrow-up-b,.ion-arrow-up-c,.ion-at,.ion-bag,.ion-battery-charging,.ion-battery-empty,.ion-battery-full,.ion-battery-half,.ion-battery-low,.ion-beaker,.ion-beer,.ion-bluetooth,.ion-bookmark,.ion-briefcase,.ion-bug,.ion-calculator,.ion-calendar,.ion-camera,.ion-card,.ion-chatbox,.ion-chatbox-working,.ion-chatboxes,.ion-chatbubble,.ion-chatbubble-working,.ion-chatbubbles,.ion-checkmark,.ion-checkmark-circled,.ion-checkmark-round,.ion-chevron-down,.ion-chevron-left,.ion-chevron-right,.ion-chevron-up,.ion-clipboard,.ion-clock,.ion-close,.ion-close-circled,.ion-close-round,.ion-cloud,.ion-code,.ion-code-download,.ion-code-working,.ion-coffee,.ion-compass,.ion-compose,.ion-connection-bars,.ion-contrast,.ion-disc,.ion-document,.ion-document-text,.ion-drag,.ion-earth,.ion-edit,.ion-egg,.ion-eject,.ion-email,.ion-eye,.ion-eye-disabled,.ion-female,.ion-filing,.ion-film-marker,.ion-flag,.ion-flash,.ion-flash-off,.ion-flask,.ion-folder,.ion-fork,.ion-fork-repo,.ion-forward,.ion-game-controller-a,.ion-game-controller-b,.ion-gear-a,.ion-gear-b,.ion-grid,.ion-hammer,.ion-headphone,.ion-heart,.ion-help,.ion-help-buoy,.ion-help-circled,.ion-home,.ion-icecream,.ion-icon-social-google-plus,.ion-icon-social-google-plus-outline,.ion-image,.ion-images,.ion-information,.ion-information-circled,.ion-ionic,.ion-ios7-alarm,.ion-ios7-alarm-outline,.ion-ios7-albums,.ion-ios7-albums-outline,.ion-ios7-arrow-back,.ion-ios7-arrow-down,.ion-ios7-arrow-forward,.ion-ios7-arrow-left,.ion-ios7-arrow-right,.ion-ios7-arrow-thin-down,.ion-ios7-arrow-thin-left,.ion-ios7-arrow-thin-right,.ion-ios7-arrow-thin-up,.ion-ios7-arrow-up,.ion-ios7-at,.ion-ios7-at-outline,.ion-ios7-bell,.ion-ios7-bell-outline,.ion-ios7-bolt,.ion-ios7-bolt-outline,.ion-ios7-bookmarks,.ion-ios7-bookmarks-outline,.ion-ios7-box,.ion-ios7-box-outline,.ion-ios7-briefcase,.ion-ios7-briefcase-outline,.ion-ios7-browsers,.ion-ios7-browsers-outline,.ion-ios7-calculator,.ion-ios7-calculator-outline,.ion-ios7-calendar,.ion-ios7-calendar-outline,.ion-ios7-camera,.ion-ios7-camera-outline,.ion-ios7-cart,.ion-ios7-cart-outline,.ion-ios7-chatboxes,.ion-ios7-chatboxes-outline,.ion-ios7-chatbubble,.ion-ios7-chatbubble-outline,.ion-ios7-checkmark,.ion-ios7-checkmark-empty,.ion-ios7-checkmark-outline,.ion-ios7-circle-filled,.ion-ios7-circle-outline,.ion-ios7-clock,.ion-ios7-clock-outline,.ion-ios7-close,.ion-ios7-close-empty,.ion-ios7-close-outline,.ion-ios7-cloud,.ion-ios7-cloud-download,.ion-ios7-cloud-download-outline,.ion-ios7-cloud-outline,.ion-ios7-cloud-upload,.ion-ios7-cloud-upload-outline,.ion-ios7-cloudy,.ion-ios7-cloudy-night,.ion-ios7-cloudy-night-outline,.ion-ios7-cloudy-outline,.ion-ios7-cog,.ion-ios7-cog-outline,.ion-ios7-compose,.ion-ios7-compose-outline,.ion-ios7-contact,.ion-ios7-contact-outline,.ion-ios7-copy,.ion-ios7-copy-outline,.ion-ios7-download,.ion-ios7-download-outline,.ion-ios7-drag,.ion-ios7-email,.ion-ios7-email-outline,.ion-ios7-eye,.ion-ios7-eye-outline,.ion-ios7-fastforward,.ion-ios7-fastforward-outline,.ion-ios7-filing,.ion-ios7-filing-outline,.ion-ios7-film,.ion-ios7-film-outline,.ion-ios7-flag,.ion-ios7-flag-outline,.ion-ios7-folder,.ion-ios7-folder-outline,.ion-ios7-gear,.ion-ios7-gear-outline,.ion-ios7-glasses,.ion-ios7-glasses-outline,.ion-ios7-heart,.ion-ios7-heart-outline,.ion-ios7-help,.ion-ios7-help-empty,.ion-ios7-help-outline,.ion-ios7-infinite,.ion-ios7-infinite-outline,.ion-ios7-information,.ion-ios7-information-empty,.ion-ios7-information-outline,.ion-ios7-ionic-outline,.ion-ios7-keypad,.ion-ios7-keypad-outline,.ion-ios7-lightbulb,.ion-ios7-lightbulb-outline,.ion-ios7-location,.ion-ios7-location-outline,.ion-ios7-locked,.ion-ios7-locked-outline,.ion-ios7-medkit,.ion-ios7-medkit-outline,.ion-ios7-mic,.ion-ios7-mic-off,.ion-ios7-mic-outline,.ion-ios7-minus,.ion-ios7-minus-empty,.ion-ios7-minus-outline,.ion-ios7-monitor,.ion-ios7-monitor-outline,.ion-ios7-moon,.ion-ios7-moon-outline,.ion-ios7-more,.ion-ios7-more-outline,.ion-ios7-musical-note,.ion-ios7-musical-notes,.ion-ios7-navigate,.ion-ios7-navigate-outline,.ion-ios7-paperplane,.ion-ios7-paperplane-outline,.ion-ios7-partlysunny,.ion-ios7-partlysunny-outline,.ion-ios7-pause,.ion-ios7-pause-outline,.ion-ios7-people,.ion-ios7-people-outline,.ion-ios7-person,.ion-ios7-person-outline,.ion-ios7-personadd,.ion-ios7-personadd-outline,.ion-ios7-photos,.ion-ios7-photos-outline,.ion-ios7-pie,.ion-ios7-pie-outline,.ion-ios7-play,.ion-ios7-play-outline,.ion-ios7-plus,.ion-ios7-plus-empty,.ion-ios7-plus-outline,.ion-ios7-pricetag,.ion-ios7-pricetag-outline,.ion-ios7-printer,.ion-ios7-printer-outline,.ion-ios7-rainy,.ion-ios7-rainy-outline,.ion-ios7-recording,.ion-ios7-recording-outline,.ion-ios7-redo,.ion-ios7-redo-outline,.ion-ios7-refresh,.ion-ios7-refresh-empty,.ion-ios7-refresh-outline,.ion-ios7-reload,.ion-ios7-reloading,.ion-ios7-rewind,.ion-ios7-rewind-outline,.ion-ios7-search,.ion-ios7-search-strong,.ion-ios7-skipbackward,.ion-ios7-skipbackward-outline,.ion-ios7-skipforward,.ion-ios7-skipforward-outline,.ion-ios7-snowy,.ion-ios7-speedometer,.ion-ios7-speedometer-outline,.ion-ios7-star,.ion-ios7-star-outline,.ion-ios7-stopwatch,.ion-ios7-stopwatch-outline,.ion-ios7-sunny,.ion-ios7-sunny-outline,.ion-ios7-telephone,.ion-ios7-telephone-outline,.ion-ios7-thunderstorm,.ion-ios7-thunderstorm-outline,.ion-ios7-time,.ion-ios7-time-outline,.ion-ios7-timer,.ion-ios7-timer-outline,.ion-ios7-trash,.ion-ios7-trash-outline,.ion-ios7-undo,.ion-ios7-undo-outline,.ion-ios7-unlocked,.ion-ios7-unlocked-outline,.ion-ios7-upload,.ion-ios7-upload-outline,.ion-ios7-videocam,.ion-ios7-videocam-outline,.ion-ios7-volume-high,.ion-ios7-volume-low,.ion-ios7-wineglass,.ion-ios7-wineglass-outline,.ion-ios7-world,.ion-ios7-world-outline,.ion-ipad,.ion-iphone,.ion-ipod,.ion-jet,.ion-key,.ion-knife,.ion-laptop,.ion-leaf,.ion-levels,.ion-lightbulb,.ion-link,.ion-load-a,.ion-load-b,.ion-load-c,.ion-load-d,.ion-loading-a,.ion-loading-b,.ion-loading-c,.ion-loading-d,.ion-location,.ion-locked,.ion-log-in,.ion-log-out,.ion-loop,.ion-looping,.ion-magnet,.ion-male,.ion-man,.ion-map,.ion-medkit,.ion-mic-a,.ion-mic-b,.ion-mic-c,.ion-minus,.ion-minus-circled,.ion-minus-round,.ion-model-s,.ion-monitor,.ion-more,.ion-music-note,.ion-navicon,.ion-navicon-round,.ion-navigate,.ion-no-smoking,.ion-nuclear,.ion-paper-airplane,.ion-paperclip,.ion-pause,.ion-person,.ion-person-add,.ion-person-stalker,.ion-pie-graph,.ion-pin,.ion-pinpoint,.ion-pizza,.ion-plane,.ion-play,.ion-playstation,.ion-plus,.ion-plus-circled,.ion-plus-round,.ion-pound,.ion-power,.ion-pricetag,.ion-pricetags,.ion-printer,.ion-radio-waves,.ion-record,.ion-refresh,.ion-refreshing,.ion-reply,.ion-reply-all,.ion-search,.ion-settings,.ion-share,.ion-shuffle,.ion-skip-backward,.ion-skip-forward,.ion-social-android,.ion-social-android-outline,.ion-social-apple,.ion-social-apple-outline,.ion-social-bitcoin,.ion-social-bitcoin-outline,.ion-social-buffer,.ion-social-buffer-outline,.ion-social-designernews,.ion-social-designernews-outline,.ion-social-dribbble,.ion-social-dribbble-outline,.ion-social-dropbox,.ion-social-dropbox-outline,.ion-social-facebook,.ion-social-facebook-outline,.ion-social-freebsd-devil,.ion-social-github,.ion-social-github-outline,.ion-social-googleplus,.ion-social-googleplus-outline,.ion-social-hackernews,.ion-social-hackernews-outline,.ion-social-linkedin,.ion-social-linkedin-outline,.ion-social-pinterest,.ion-social-pinterest-outline,.ion-social-reddit,.ion-social-reddit-outline,.ion-social-rss,.ion-social-rss-outline,.ion-social-skype,.ion-social-skype-outline,.ion-social-tumblr,.ion-social-tumblr-outline,.ion-social-tux,.ion-social-twitter,.ion-social-twitter-outline,.ion-social-vimeo,.ion-social-vimeo-outline,.ion-social-windows,.ion-social-windows-outline,.ion-social-wordpress,.ion-social-wordpress-outline,.ion-social-yahoo,.ion-social-yahoo-outline,.ion-social-youtube,.ion-social-youtube-outline,.ion-speakerphone,.ion-speedometer,.ion-spoon,.ion-star,.ion-stats-bars,.ion-steam,.ion-stop,.ion-thermometer,.ion-thumbsdown,.ion-thumbsup,.ion-trash-a,.ion-trash-b,.ion-umbrella,.ion-unlocked,.ion-upload,.ion-usb,.ion-videocamera,.ion-volume-high,.ion-volume-low,.ion-volume-medium,.ion-volume-mute,.ion-waterdrop,.ion-wifi,.ion-wineglass,.ion-woman,.ion-wrench,.ion-xbox,.ionicons{display:inline-block;font-family:Ionicons;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;text-rendering:auto;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ion-ios7-reloading,.ion-loading-a,.ion-loading-b,.ion-loading-c,.ion-loading-d,.ion-looping,.ion-refreshing,.ion-spin{-webkit-animation:spin 1s infinite linear;-moz-animation:spin 1s infinite linear;-o-animation:spin 1s infinite linear;animation:spin 1s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)}100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}.ion-loading-a{-webkit-animation-timing-function:steps(8,start);-moz-animation-timing-function:steps(8,start);animation-timing-function:steps(8,start)}.ion-alert:before{content:"\f101"}.ion-alert-circled:before{content:"\f100"}.ion-android-add:before{content:"\f2c7"}.ion-android-add-contact:before{content:"\f2c6"}.ion-android-alarm:before{content:"\f2c8"}.ion-android-archive:before{content:"\f2c9"}.ion-android-arrow-back:before{content:"\f2ca"}.ion-android-arrow-down-left:before{content:"\f2cb"}.ion-android-arrow-down-right:before{content:"\f2cc"}.ion-android-arrow-up-left:before{content:"\f2cd"}.ion-android-arrow-up-right:before{content:"\f2ce"}.ion-android-battery:before{content:"\f2cf"}.ion-android-book:before{content:"\f2d0"}.ion-android-calendar:before{content:"\f2d1"}.ion-android-call:before{content:"\f2d2"}.ion-android-camera:before{content:"\f2d3"}.ion-android-chat:before{content:"\f2d4"}.ion-android-checkmark:before{content:"\f2d5"}.ion-android-clock:before{content:"\f2d6"}.ion-android-close:before{content:"\f2d7"}.ion-android-contact:before{content:"\f2d8"}.ion-android-contacts:before{content:"\f2d9"}.ion-android-data:before{content:"\f2da"}.ion-android-developer:before{content:"\f2db"}.ion-android-display:before{content:"\f2dc"}.ion-android-download:before{content:"\f2dd"}.ion-android-dropdown:before{content:"\f2de"}.ion-android-earth:before{content:"\f2df"}.ion-android-folder:before{content:"\f2e0"}.ion-android-forums:before{content:"\f2e1"}.ion-android-friends:before{content:"\f2e2"}.ion-android-hand:before{content:"\f2e3"}.ion-android-image:before{content:"\f2e4"}.ion-android-inbox:before{content:"\f2e5"}.ion-android-information:before{content:"\f2e6"}.ion-android-keypad:before{content:"\f2e7"}.ion-android-lightbulb:before{content:"\f2e8"}.ion-android-locate:before{content:"\f2e9"}.ion-android-location:before{content:"\f2ea"}.ion-android-mail:before{content:"\f2eb"}.ion-android-microphone:before{content:"\f2ec"}.ion-android-mixer:before{content:"\f2ed"}.ion-android-more:before{content:"\f2ee"}.ion-android-note:before{content:"\f2ef"}.ion-android-playstore:before{content:"\f2f0"}.ion-android-printer:before{content:"\f2f1"}.ion-android-promotion:before{content:"\f2f2"}.ion-android-reminder:before{content:"\f2f3"}.ion-android-remove:before{content:"\f2f4"}.ion-android-search:before{content:"\f2f5"}.ion-android-send:before{content:"\f2f6"}.ion-android-settings:before{content:"\f2f7"}.ion-android-share:before{content:"\f2f8"}.ion-android-social:before{content:"\f2fa"}.ion-android-social-user:before{content:"\f2f9"}.ion-android-sort:before{content:"\f2fb"}.ion-android-star:before{content:"\f2fc"}.ion-android-stopwatch:before{content:"\f2fd"}.ion-android-storage:before{content:"\f2fe"}.ion-android-system-back:before{content:"\f2ff"}.ion-android-system-home:before{content:"\f300"}.ion-android-system-windows:before{content:"\f301"}.ion-android-timer:before{content:"\f302"}.ion-android-trash:before{content:"\f303"}.ion-android-volume:before{content:"\f304"}.ion-android-wifi:before{content:"\f305"}.ion-archive:before{content:"\f102"}.ion-arrow-down-a:before{content:"\f103"}.ion-arrow-down-b:before{content:"\f104"}.ion-arrow-down-c:before{content:"\f105"}.ion-arrow-expand:before{content:"\f25e"}.ion-arrow-graph-down-left:before{content:"\f25f"}.ion-arrow-graph-down-right:before{content:"\f260"}.ion-arrow-graph-up-left:before{content:"\f261"}.ion-arrow-graph-up-right:before{content:"\f262"}.ion-arrow-left-a:before{content:"\f106"}.ion-arrow-left-b:before{content:"\f107"}.ion-arrow-left-c:before{content:"\f108"}.ion-arrow-move:before{content:"\f263"}.ion-arrow-resize:before{content:"\f264"}.ion-arrow-return-left:before{content:"\f265"}.ion-arrow-return-right:before{content:"\f266"}.ion-arrow-right-a:before{content:"\f109"}.ion-arrow-right-b:before{content:"\f10a"}.ion-arrow-right-c:before{content:"\f10b"}.ion-arrow-shrink:before{content:"\f267"}.ion-arrow-swap:before{content:"\f268"}.ion-arrow-up-a:before{content:"\f10c"}.ion-arrow-up-b:before{content:"\f10d"}.ion-arrow-up-c:before{content:"\f10e"}.ion-at:before{content:"\f10f"}.ion-bag:before{content:"\f110"}.ion-battery-charging:before{content:"\f111"}.ion-battery-empty:before{content:"\f112"}.ion-battery-full:before{content:"\f113"}.ion-battery-half:before{content:"\f114"}.ion-battery-low:before{content:"\f115"}.ion-beaker:before{content:"\f269"}.ion-beer:before{content:"\f26a"}.ion-bluetooth:before{content:"\f116"}.ion-bookmark:before{content:"\f26b"}.ion-briefcase:before{content:"\f26c"}.ion-bug:before{content:"\f2be"}.ion-calculator:before{content:"\f26d"}.ion-calendar:before{content:"\f117"}.ion-camera:before{content:"\f118"}.ion-card:before{content:"\f119"}.ion-chatbox:before{content:"\f11b"}.ion-chatbox-working:before{content:"\f11a"}.ion-chatboxes:before{content:"\f11c"}.ion-chatbubble:before{content:"\f11e"}.ion-chatbubble-working:before{content:"\f11d"}.ion-chatbubbles:before{content:"\f11f"}.ion-checkmark:before{content:"\f122"}.ion-checkmark-circled:before{content:"\f120"}.ion-checkmark-round:before{content:"\f121"}.ion-chevron-down:before{content:"\f123"}.ion-chevron-left:before{content:"\f124"}.ion-chevron-right:before{content:"\f125"}.ion-chevron-up:before{content:"\f126"}.ion-clipboard:before{content:"\f127"}.ion-clock:before{content:"\f26e"}.ion-close:before{content:"\f12a"}.ion-close-circled:before{content:"\f128"}.ion-close-round:before{content:"\f129"}.ion-cloud:before{content:"\f12b"}.ion-code:before{content:"\f271"}.ion-code-download:before{content:"\f26f"}.ion-code-working:before{content:"\f270"}.ion-coffee:before{content:"\f272"}.ion-compass:before{content:"\f273"}.ion-compose:before{content:"\f12c"}.ion-connection-bars:before{content:"\f274"}.ion-contrast:before{content:"\f275"}.ion-disc:before{content:"\f12d"}.ion-document:before{content:"\f12f"}.ion-document-text:before{content:"\f12e"}.ion-drag:before{content:"\f130"}.ion-earth:before{content:"\f276"}.ion-edit:before{content:"\f2bf"}.ion-egg:before{content:"\f277"}.ion-eject:before{content:"\f131"}.ion-email:before{content:"\f132"}.ion-eye:before{content:"\f133"}.ion-eye-disabled:before{content:"\f306"}.ion-female:before{content:"\f278"}.ion-filing:before{content:"\f134"}.ion-film-marker:before{content:"\f135"}.ion-flag:before{content:"\f279"}.ion-flash:before{content:"\f137"}.ion-flash-off:before{content:"\f136"}.ion-flask:before{content:"\f138"}.ion-folder:before{content:"\f139"}.ion-fork:before{content:"\f27a"}.ion-fork-repo:before{content:"\f2c0"}.ion-forward:before{content:"\f13a"}.ion-game-controller-a:before{content:"\f13b"}.ion-game-controller-b:before{content:"\f13c"}.ion-gear-a:before{content:"\f13d"}.ion-gear-b:before{content:"\f13e"}.ion-grid:before{content:"\f13f"}.ion-hammer:before{content:"\f27b"}.ion-headphone:before{content:"\f140"}.ion-heart:before{content:"\f141"}.ion-help:before{content:"\f143"}.ion-help-buoy:before{content:"\f27c"}.ion-help-circled:before{content:"\f142"}.ion-home:before{content:"\f144"}.ion-icecream:before{content:"\f27d"}.ion-icon-social-google-plus:before{content:"\f146"}.ion-icon-social-google-plus-outline:before{content:"\f145"}.ion-image:before{content:"\f147"}.ion-images:before{content:"\f148"}.ion-information:before{content:"\f14a"}.ion-information-circled:before{content:"\f149"}.ion-ionic:before{content:"\f14b"}.ion-ios7-alarm:before{content:"\f14d"}.ion-ios7-alarm-outline:before{content:"\f14c"}.ion-ios7-albums:before{content:"\f14f"}.ion-ios7-albums-outline:before{content:"\f14e"}.ion-ios7-arrow-back:before{content:"\f150"}.ion-ios7-arrow-down:before{content:"\f151"}.ion-ios7-arrow-forward:before{content:"\f152"}.ion-ios7-arrow-left:before{content:"\f153"}.ion-ios7-arrow-right:before{content:"\f154"}.ion-ios7-arrow-thin-down:before{content:"\f27e"}.ion-ios7-arrow-thin-left:before{content:"\f27f"}.ion-ios7-arrow-thin-right:before{content:"\f280"}.ion-ios7-arrow-thin-up:before{content:"\f281"}.ion-ios7-arrow-up:before{content:"\f155"}.ion-ios7-at:before{content:"\f157"}.ion-ios7-at-outline:before{content:"\f156"}.ion-ios7-bell:before{content:"\f159"}.ion-ios7-bell-outline:before{content:"\f158"}.ion-ios7-bolt:before{content:"\f15b"}.ion-ios7-bolt-outline:before{content:"\f15a"}.ion-ios7-bookmarks:before{content:"\f15d"}.ion-ios7-bookmarks-outline:before{content:"\f15c"}.ion-ios7-box:before{content:"\f15f"}.ion-ios7-box-outline:before{content:"\f15e"}.ion-ios7-briefcase:before{content:"\f283"}.ion-ios7-briefcase-outline:before{content:"\f282"}.ion-ios7-browsers:before{content:"\f161"}.ion-ios7-browsers-outline:before{content:"\f160"}.ion-ios7-calculator:before{content:"\f285"}.ion-ios7-calculator-outline:before{content:"\f284"}.ion-ios7-calendar:before{content:"\f163"}.ion-ios7-calendar-outline:before{content:"\f162"}.ion-ios7-camera:before{content:"\f165"}.ion-ios7-camera-outline:before{content:"\f164"}.ion-ios7-cart:before{content:"\f167"}.ion-ios7-cart-outline:before{content:"\f166"}.ion-ios7-chatboxes:before{content:"\f169"}.ion-ios7-chatboxes-outline:before{content:"\f168"}.ion-ios7-chatbubble:before{content:"\f16b"}.ion-ios7-chatbubble-outline:before{content:"\f16a"}.ion-ios7-checkmark:before{content:"\f16e"}.ion-ios7-checkmark-empty:before{content:"\f16c"}.ion-ios7-checkmark-outline:before{content:"\f16d"}.ion-ios7-circle-filled:before{content:"\f16f"}.ion-ios7-circle-outline:before{content:"\f170"}.ion-ios7-clock:before{content:"\f172"}.ion-ios7-clock-outline:before{content:"\f171"}.ion-ios7-close:before{content:"\f2bc"}.ion-ios7-close-empty:before{content:"\f2bd"}.ion-ios7-close-outline:before{content:"\f2bb"}.ion-ios7-cloud:before{content:"\f178"}.ion-ios7-cloud-download:before{content:"\f174"}.ion-ios7-cloud-download-outline:before{content:"\f173"}.ion-ios7-cloud-outline:before{content:"\f175"}.ion-ios7-cloud-upload:before{content:"\f177"}.ion-ios7-cloud-upload-outline:before{content:"\f176"}.ion-ios7-cloudy:before{content:"\f17a"}.ion-ios7-cloudy-night:before{content:"\f308"}.ion-ios7-cloudy-night-outline:before{content:"\f307"}.ion-ios7-cloudy-outline:before{content:"\f179"}.ion-ios7-cog:before{content:"\f17c"}.ion-ios7-cog-outline:before{content:"\f17b"}.ion-ios7-compose:before{content:"\f17e"}.ion-ios7-compose-outline:before{content:"\f17d"}.ion-ios7-contact:before{content:"\f180"}.ion-ios7-contact-outline:before{content:"\f17f"}.ion-ios7-copy:before{content:"\f182"}.ion-ios7-copy-outline:before{content:"\f181"}.ion-ios7-download:before{content:"\f184"}.ion-ios7-download-outline:before{content:"\f183"}.ion-ios7-drag:before{content:"\f185"}.ion-ios7-email:before{content:"\f187"}.ion-ios7-email-outline:before{content:"\f186"}.ion-ios7-eye:before{content:"\f189"}.ion-ios7-eye-outline:before{content:"\f188"}.ion-ios7-fastforward:before{content:"\f18b"}.ion-ios7-fastforward-outline:before{content:"\f18a"}.ion-ios7-filing:before{content:"\f18d"}.ion-ios7-filing-outline:before{content:"\f18c"}.ion-ios7-film:before{content:"\f18f"}.ion-ios7-film-outline:before{content:"\f18e"}.ion-ios7-flag:before{content:"\f191"}.ion-ios7-flag-outline:before{content:"\f190"}.ion-ios7-folder:before{content:"\f193"}.ion-ios7-folder-outline:before{content:"\f192"}.ion-ios7-gear:before{content:"\f195"}.ion-ios7-gear-outline:before{content:"\f194"}.ion-ios7-glasses:before{content:"\f197"}.ion-ios7-glasses-outline:before{content:"\f196"}.ion-ios7-heart:before{content:"\f199"}.ion-ios7-heart-outline:before{content:"\f198"}.ion-ios7-help:before{content:"\f19c"}.ion-ios7-help-empty:before{content:"\f19a"}.ion-ios7-help-outline:before{content:"\f19b"}.ion-ios7-infinite:before{content:"\f19e"}.ion-ios7-infinite-outline:before{content:"\f19d"}.ion-ios7-information:before{content:"\f1a1"}.ion-ios7-information-empty:before{content:"\f19f"}.ion-ios7-information-outline:before{content:"\f1a0"}.ion-ios7-ionic-outline:before{content:"\f1a2"}.ion-ios7-keypad:before{content:"\f1a4"}.ion-ios7-keypad-outline:before{content:"\f1a3"}.ion-ios7-lightbulb:before{content:"\f287"}.ion-ios7-lightbulb-outline:before{content:"\f286"}.ion-ios7-location:before{content:"\f1a6"}.ion-ios7-location-outline:before{content:"\f1a5"}.ion-ios7-locked:before{content:"\f1a8"}.ion-ios7-locked-outline:before{content:"\f1a7"}.ion-ios7-medkit:before{content:"\f289"}.ion-ios7-medkit-outline:before{content:"\f288"}.ion-ios7-mic:before{content:"\f1ab"}.ion-ios7-mic-off:before{content:"\f1a9"}.ion-ios7-mic-outline:before{content:"\f1aa"}.ion-ios7-minus:before{content:"\f1ae"}.ion-ios7-minus-empty:before{content:"\f1ac"}.ion-ios7-minus-outline:before{content:"\f1ad"}.ion-ios7-monitor:before{content:"\f1b0"}.ion-ios7-monitor-outline:before{content:"\f1af"}.ion-ios7-moon:before{content:"\f1b2"}.ion-ios7-moon-outline:before{content:"\f1b1"}.ion-ios7-more:before{content:"\f1b4"}.ion-ios7-more-outline:before{content:"\f1b3"}.ion-ios7-musical-note:before{content:"\f1b5"}.ion-ios7-musical-notes:before{content:"\f1b6"}.ion-ios7-navigate:before{content:"\f1b8"}.ion-ios7-navigate-outline:before{content:"\f1b7"}.ion-ios7-paperplane:before{content:"\f1ba"}.ion-ios7-paperplane-outline:before{content:"\f1b9"}.ion-ios7-partlysunny:before{content:"\f1bc"}.ion-ios7-partlysunny-outline:before{content:"\f1bb"}.ion-ios7-pause:before{content:"\f1be"}.ion-ios7-pause-outline:before{content:"\f1bd"}.ion-ios7-people:before{content:"\f1c0"}.ion-ios7-people-outline:before{content:"\f1bf"}.ion-ios7-person:before{content:"\f1c2"}.ion-ios7-person-outline:before{content:"\f1c1"}.ion-ios7-personadd:before{content:"\f1c4"}.ion-ios7-personadd-outline:before{content:"\f1c3"}.ion-ios7-photos:before{content:"\f1c6"}.ion-ios7-photos-outline:before{content:"\f1c5"}.ion-ios7-pie:before{content:"\f28b"}.ion-ios7-pie-outline:before{content:"\f28a"}.ion-ios7-play:before{content:"\f1c8"}.ion-ios7-play-outline:before{content:"\f1c7"}.ion-ios7-plus:before{content:"\f1cb"}.ion-ios7-plus-empty:before{content:"\f1c9"}.ion-ios7-plus-outline:before{content:"\f1ca"}.ion-ios7-pricetag:before{content:"\f28d"}.ion-ios7-pricetag-outline:before{content:"\f28c"}.ion-ios7-printer:before{content:"\f1cd"}.ion-ios7-printer-outline:before{content:"\f1cc"}.ion-ios7-rainy:before{content:"\f1cf"}.ion-ios7-rainy-outline:before{content:"\f1ce"}.ion-ios7-recording:before{content:"\f1d1"}.ion-ios7-recording-outline:before{content:"\f1d0"}.ion-ios7-redo:before{content:"\f1d3"}.ion-ios7-redo-outline:before{content:"\f1d2"}.ion-ios7-refresh:before{content:"\f1d6"}.ion-ios7-refresh-empty:before{content:"\f1d4"}.ion-ios7-refresh-outline:before{content:"\f1d5"}.ion-ios7-reload:before,.ion-ios7-reloading:before{content:"\f28e"}.ion-ios7-rewind:before{content:"\f1d8"}.ion-ios7-rewind-outline:before{content:"\f1d7"}.ion-ios7-search:before{content:"\f1da"}.ion-ios7-search-strong:before{content:"\f1d9"}.ion-ios7-skipbackward:before{content:"\f1dc"}.ion-ios7-skipbackward-outline:before{content:"\f1db"}.ion-ios7-skipforward:before{content:"\f1de"}.ion-ios7-skipforward-outline:before{content:"\f1dd"}.ion-ios7-snowy:before{content:"\f309"}.ion-ios7-speedometer:before{content:"\f290"}.ion-ios7-speedometer-outline:before{content:"\f28f"}.ion-ios7-star:before{content:"\f1e0"}.ion-ios7-star-outline:before{content:"\f1df"}.ion-ios7-stopwatch:before{content:"\f1e2"}.ion-ios7-stopwatch-outline:before{content:"\f1e1"}.ion-ios7-sunny:before{content:"\f1e4"}.ion-ios7-sunny-outline:before{content:"\f1e3"}.ion-ios7-telephone:before{content:"\f1e6"}.ion-ios7-telephone-outline:before{content:"\f1e5"}.ion-ios7-thunderstorm:before{content:"\f1e8"}.ion-ios7-thunderstorm-outline:before{content:"\f1e7"}.ion-ios7-time:before{content:"\f292"}.ion-ios7-time-outline:before{content:"\f291"}.ion-ios7-timer:before{content:"\f1ea"}.ion-ios7-timer-outline:before{content:"\f1e9"}.ion-ios7-trash:before{content:"\f1ec"}.ion-ios7-trash-outline:before{content:"\f1eb"}.ion-ios7-undo:before{content:"\f1ee"}.ion-ios7-undo-outline:before{content:"\f1ed"}.ion-ios7-unlocked:before{content:"\f1f0"}.ion-ios7-unlocked-outline:before{content:"\f1ef"}.ion-ios7-upload:before{content:"\f1f2"}.ion-ios7-upload-outline:before{content:"\f1f1"}.ion-ios7-videocam:before{content:"\f1f4"}.ion-ios7-videocam-outline:before{content:"\f1f3"}.ion-ios7-volume-high:before{content:"\f1f5"}.ion-ios7-volume-low:before{content:"\f1f6"}.ion-ios7-wineglass:before{content:"\f294"}.ion-ios7-wineglass-outline:before{content:"\f293"}.ion-ios7-world:before{content:"\f1f8"}.ion-ios7-world-outline:before{content:"\f1f7"}.ion-ipad:before{content:"\f1f9"}.ion-iphone:before{content:"\f1fa"}.ion-ipod:before{content:"\f1fb"}.ion-jet:before{content:"\f295"}.ion-key:before{content:"\f296"}.ion-knife:before{content:"\f297"}.ion-laptop:before{content:"\f1fc"}.ion-leaf:before{content:"\f1fd"}.ion-levels:before{content:"\f298"}.ion-lightbulb:before{content:"\f299"}.ion-link:before{content:"\f1fe"}.ion-load-a:before,.ion-loading-a:before{content:"\f29a"}.ion-load-b:before,.ion-loading-b:before{content:"\f29b"}.ion-load-c:before,.ion-loading-c:before{content:"\f29c"}.ion-load-d:before,.ion-loading-d:before{content:"\f29d"}.ion-location:before{content:"\f1ff"}.ion-locked:before{content:"\f200"}.ion-log-in:before{content:"\f29e"}.ion-log-out:before{content:"\f29f"}.ion-loop:before,.ion-looping:before{content:"\f201"}.ion-magnet:before{content:"\f2a0"}.ion-male:before{content:"\f2a1"}.ion-man:before{content:"\f202"}.ion-map:before{content:"\f203"}.ion-medkit:before{content:"\f2a2"}.ion-mic-a:before{content:"\f204"}.ion-mic-b:before{content:"\f205"}.ion-mic-c:before{content:"\f206"}.ion-minus:before{content:"\f209"}.ion-minus-circled:before{content:"\f207"}.ion-minus-round:before{content:"\f208"}.ion-model-s:before{content:"\f2c1"}.ion-monitor:before{content:"\f20a"}.ion-more:before{content:"\f20b"}.ion-music-note:before{content:"\f20c"}.ion-navicon:before{content:"\f20e"}.ion-navicon-round:before{content:"\f20d"}.ion-navigate:before{content:"\f2a3"}.ion-no-smoking:before{content:"\f2c2"}.ion-nuclear:before{content:"\f2a4"}.ion-paper-airplane:before{content:"\f2c3"}.ion-paperclip:before{content:"\f20f"}.ion-pause:before{content:"\f210"}.ion-person:before{content:"\f213"}.ion-person-add:before{content:"\f211"}.ion-person-stalker:before{content:"\f212"}.ion-pie-graph:before{content:"\f2a5"}.ion-pin:before{content:"\f2a6"}.ion-pinpoint:before{content:"\f2a7"}.ion-pizza:before{content:"\f2a8"}.ion-plane:before{content:"\f214"}.ion-play:before{content:"\f215"}.ion-playstation:before{content:"\f30a"}.ion-plus:before{content:"\f218"}.ion-plus-circled:before{content:"\f216"}.ion-plus-round:before{content:"\f217"}.ion-pound:before{content:"\f219"}.ion-power:before{content:"\f2a9"}.ion-pricetag:before{content:"\f2aa"}.ion-pricetags:before{content:"\f2ab"}.ion-printer:before{content:"\f21a"}.ion-radio-waves:before{content:"\f2ac"}.ion-record:before{content:"\f21b"}.ion-refresh:before,.ion-refreshing:before{content:"\f21c"}.ion-reply:before{content:"\f21e"}.ion-reply-all:before{content:"\f21d"}.ion-search:before{content:"\f21f"}.ion-settings:before{content:"\f2ad"}.ion-share:before{content:"\f220"}.ion-shuffle:before{content:"\f221"}.ion-skip-backward:before{content:"\f222"}.ion-skip-forward:before{content:"\f223"}.ion-social-android:before{content:"\f225"}.ion-social-android-outline:before{content:"\f224"}.ion-social-apple:before{content:"\f227"}.ion-social-apple-outline:before{content:"\f226"}.ion-social-bitcoin:before{content:"\f2af"}.ion-social-bitcoin-outline:before{content:"\f2ae"}.ion-social-buffer:before{content:"\f229"}.ion-social-buffer-outline:before{content:"\f228"}.ion-social-designernews:before{content:"\f22b"}.ion-social-designernews-outline:before{content:"\f22a"}.ion-social-dribbble:before{content:"\f22d"}.ion-social-dribbble-outline:before{content:"\f22c"}.ion-social-dropbox:before{content:"\f22f"}.ion-social-dropbox-outline:before{content:"\f22e"}.ion-social-facebook:before{content:"\f231"}.ion-social-facebook-outline:before{content:"\f230"}.ion-social-freebsd-devil:before{content:"\f2c4"}.ion-social-github:before{content:"\f233"}.ion-social-github-outline:before{content:"\f232"}.ion-social-googleplus:before{content:"\f235"}.ion-social-googleplus-outline:before{content:"\f234"}.ion-social-hackernews:before{content:"\f237"}.ion-social-hackernews-outline:before{content:"\f236"}.ion-social-linkedin:before{content:"\f239"}.ion-social-linkedin-outline:before{content:"\f238"}.ion-social-pinterest:before{content:"\f2b1"}.ion-social-pinterest-outline:before{content:"\f2b0"}.ion-social-reddit:before{content:"\f23b"}.ion-social-reddit-outline:before{content:"\f23a"}.ion-social-rss:before{content:"\f23d"}.ion-social-rss-outline:before{content:"\f23c"}.ion-social-skype:before{content:"\f23f"}.ion-social-skype-outline:before{content:"\f23e"}.ion-social-tumblr:before{content:"\f241"}.ion-social-tumblr-outline:before{content:"\f240"}.ion-social-tux:before{content:"\f2c5"}.ion-social-twitter:before{content:"\f243"}.ion-social-twitter-outline:before{content:"\f242"}.ion-social-vimeo:before{content:"\f245"}.ion-social-vimeo-outline:before{content:"\f244"}.ion-social-windows:before{content:"\f247"}.ion-social-windows-outline:before{content:"\f246"}.ion-social-wordpress:before{content:"\f249"}.ion-social-wordpress-outline:before{content:"\f248"}.ion-social-yahoo:before{content:"\f24b"}.ion-social-yahoo-outline:before{content:"\f24a"}.ion-social-youtube:before{content:"\f24d"}.ion-social-youtube-outline:before{content:"\f24c"}.ion-speakerphone:before{content:"\f2b2"}.ion-speedometer:before{content:"\f2b3"}.ion-spoon:before{content:"\f2b4"}.ion-star:before{content:"\f24e"}.ion-stats-bars:before{content:"\f2b5"}.ion-steam:before{content:"\f30b"}.ion-stop:before{content:"\f24f"}.ion-thermometer:before{content:"\f2b6"}.ion-thumbsdown:before{content:"\f250"}.ion-thumbsup:before{content:"\f251"}.ion-trash-a:before{content:"\f252"}.ion-trash-b:before{content:"\f253"}.ion-umbrella:before{content:"\f2b7"}.ion-unlocked:before{content:"\f254"}.ion-upload:before{content:"\f255"}.ion-usb:before{content:"\f2b8"}.ion-videocamera:before{content:"\f256"}.ion-volume-high:before{content:"\f257"}.ion-volume-low:before{content:"\f258"}.ion-volume-medium:before{content:"\f259"}.ion-volume-mute:before{content:"\f25a"}.ion-waterdrop:before{content:"\f25b"}.ion-wifi:before{content:"\f25c"}.ion-wineglass:before{content:"\f2b9"}.ion-woman:before{content:"\f25d"}.ion-wrench:before{content:"\f2ba"}.ion-xbox:before{content:"\f30c"}a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{margin:0;padding:0;border:0;vertical-align:baseline;font:inherit;font-size:100%}ol,ul{list-style:none}blockquote,q{quotes:none}audio:not([controls]){display:none;height:0}[hidden],template{display:none}script{display:none!important}html{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}:focus,a:active,a:focus,a:hover,button:focus{outline:0}b,strong{font-weight:700}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}code,kbd,pre,samp{font-size:1em;font-family:monospace,serif}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}sub,sup{position:relative;vertical-align:baseline;font-size:75%;line-height:0}sup{top:-.5em}sub{bottom:-.25em}fieldset{margin:0 2px;padding:.35em .625em .75em;border:1px solid silver}button,input,select,textarea{margin:0;outline-offset:0;outline-style:none;outline-width:0;-webkit-font-smoothing:inherit}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto}table{border-spacing:0;border-collapse:collapse}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}a{-webkit-user-drag:none;-webkit-tap-highlight-color:transparent}img{-webkit-user-drag:none}.ionic-body,body{-webkit-font-smoothing:antialiased;font-smoothing:antialiased;-webkit-backface-visibility:hidden;-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-tap-highlight-color:transparent;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:fixed;top:0;right:0;bottom:0;left:0;overflow:hidden;margin:0;padding:0;color:#000;word-wrap:break-word;font-size:14px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;line-height:20px;text-rendering:optimizeLegibility;-webkit-user-drag:none}.content:after,.content:before{display:block;overflow:hidden;height:0;content:"\00a0"}.content{position:absolute;width:100%;height:100%}.scroll-content{top:0;right:0;bottom:0;left:0;position:absolute;overflow:hidden;-webkit-backface-visibility:hidden;margin-top:-1px;width:auto;height:auto}.scroll-view{overflow:hidden;position:relative;-webkit-backface-visibility:hidden;margin-top:-1px}.scroll{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;-webkit-transform:translateZ(0);-moz-transform:translateZ(0);transform:translateZ(0);-webkit-transform-origin:left top;-moz-transform-origin:left top;transform-origin:left top;-webkit-backface-visibility:hidden}.scroll-bar{position:absolute;z-index:9999}.scroll-bar-h{height:3px;left:2px;right:2px;bottom:3px}.scroll-bar-h .scroll-bar-indicator{height:100%}.scroll-bar-v{width:3px;bottom:2px;top:2px;right:3px}.scroll-bar-v .scroll-bar-indicator{width:100%}.scroll-bar-indicator{position:absolute;background:rgba(0,0,0,.3);border-radius:4px;opacity:1}.scroll-bar-indicator.scroll-bar-fade-out{-webkit-transition:opacity .3s linear;-moz-transition:opacity .3s linear;transition:opacity .3s linear;opacity:0}.scroll-refresher{overflow:hidden;margin-top:-60px;height:60px;position:relative}.scroll-refresher .icon-refreshing{display:none;-webkit-animation-duration:1.5s;-moz-animation-duration:1.5s;animation-duration:1.5s}.ionic-refresher-content,.scroll-refresher-content{position:absolute;left:0;bottom:15px;width:100%;text-align:center;font-size:30px;color:#666}.ionic-refresher-content .icon-pulling{-webkit-animation-duration:200ms;-moz-animation-duration:200ms;animation-duration:200ms;-webkit-animation-timing-function:linear;-moz-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}@keyframes refresh-spin{0%{transform:rotate(0)}100%{transform:rotate(-180deg)}}@-webkit-keyframes refresh-spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(-180deg)}}.scroll-refresher.active .icon-pulling{display:block}.scroll-refresher.active .icon-refreshing,.scroll-refresher.active.refreshing .icon-pulling{display:none}.scroll-refresher.active.refreshing .icon-refreshing{display:block}.scroll-refresher.active .ionic-refresher-content .icon-pulling{-webkit-animation-name:refresh-spin;-moz-animation-name:refresh-spin;animation-name:refresh-spin}.overflow-scroll{overflow-x:hidden;overflow-y:scroll;-webkit-overflow-scrolling:touch}.overflow-scroll .scroll{position:static;height:100%}.has-header{top:44px}.has-subheader{top:88px}.has-footer{bottom:44px}.has-tabs{bottom:49px}.pane{position:fixed;z-index:1}.view{position:absolute;z-index:1}.pane,.view{top:0;right:0;bottom:0;left:0;width:100%;height:100%;background-color:#fff}p{margin:0 0 10px}small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:#000;font-weight:500;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;line-height:1.1}.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:400;line-height:1}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1:first-child,.h2:first-child,.h3:first-child,h1:first-child,h2:first-child,h3:first-child{margin-top:0}.h1+.h1,.h1+.h2,.h1+.h3,.h1+h1,.h1+h2,.h1+h3,.h2+.h1,.h2+.h2,.h2+.h3,.h2+h1,.h2+h2,.h2+h3,.h3+.h1,.h3+.h2,.h3+.h3,.h3+h1,.h3+h2,.h3+h3,h1+.h1,h1+.h2,h1+.h3,h1+h1,h1+h2,h1+h3,h2+.h1,h2+.h2,h2+.h3,h2+h1,h2+h2,h2+h3,h3+.h1,h3+.h2,h3+.h3,h3+h1,h3+h2,h3+h3{margin-top:10px}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}.h1 small,h1 small{font-size:24px}.h2 small,h2 small{font-size:18px}.h3 small,.h4 small,h3 small,h4 small{font-size:14px}dl{margin-bottom:20px}dd,dt{line-height:1.42857}dt{font-weight:700}blockquote{margin:0 0 20px;padding:10px 20px;border-left:5px solid gray}blockquote p{font-weight:300;font-size:17.5px;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small{display:block;line-height:1.42857}blockquote small:before{content:'\2014 \00A0'}blockquote:after,blockquote:before,q:after,q:before{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:1.42857}a.subdued{padding-right:10px;color:#888;text-decoration:none}a.subdued:hover{text-decoration:none}a.subdued:last-child{padding-right:0}@-webkit-keyframes fadeInHalf{from{background-color:rgba(0,0,0,0)}to{background-color:rgba(0,0,0,.5)}}@keyframes fadeInHalf{from{background-color:rgba(0,0,0,0)}to{background-color:rgba(0,0,0,.5)}}@-webkit-keyframes fadeOutHalf{from{background-color:rgba(0,0,0,.5)}to{background-color:rgba(0,0,0,0)}}@keyframes fadeOutHalf{from{background-color:rgba(0,0,0,.5)}to{background-color:rgba(0,0,0,0)}}.action-sheet-backdrop{position:fixed;top:0;left:0;z-index:10;width:100%;height:100%;background-color:rgba(0,0,0,0)}.action-sheet-backdrop.active{-webkit-animation:fadeInHalf .3s;-moz-animation:fadeInHalf .3s;animation:fadeInHalf .3s;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.action-sheet-backdrop.active-remove{-webkit-animation:fadeOutHalf .3s;-moz-animation:fadeOutHalf .3s;animation:fadeOutHalf .3s;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both;background-color:rgba(0,0,0,.5)}@-webkit-keyframes actionSheetUp{0%{-webkit-transform:translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes actionSheetOut{0%{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);opacity:0}}.action-sheet-up{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.action-sheet-up .ng-enter,.action-sheet-up.ng-enter{-webkit-transform:translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);-webkit-animation-duration:400ms;-moz-animation-duration:400ms;animation-duration:400ms;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-timing-function:cubic-bezier(0.1,.7,.1,1);-moz-animation-timing-function:cubic-bezier(0.1,.7,.1,1);animation-timing-function:cubic-bezier(0.1,.7,.1,1);opacity:0}.action-sheet-up .ng-enter-active,.action-sheet-up.ng-enter-active{-webkit-animation-name:actionSheetUp;-moz-animation-name:actionSheetUp;animation-name:actionSheetUp}.action-sheet-up .ng-leave,.action-sheet-up.ng-leave{-webkit-animation-duration:400ms;-moz-animation-duration:400ms;animation-duration:400ms;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-timing-function:cubic-bezier(0.1,.7,.1,1);-moz-animation-timing-function:cubic-bezier(0.1,.7,.1,1);animation-timing-function:cubic-bezier(0.1,.7,.1,1)}.action-sheet-up .ng-leave,.action-sheet-up.ng-leave-active{-webkit-animation-name:actionSheetOut;-moz-animation-name:actionSheetOut;animation-name:actionSheetOut}.action-sheet{position:fixed;bottom:0;left:15px;z-index:10;overflow:hidden;width:calc(100% - 30px)}.action-sheet .button{display:block;padding:1px;width:100%;border-radius:0;background-color:transparent;color:#4a87ee;font-size:18px}.action-sheet .button.destructive{color:#ef4e3a}.action-sheet-title{padding:10px;color:#666;text-align:center;font-size:12px}.action-sheet-group{margin-bottom:5px;border-radius:3px;background-color:#fff}.action-sheet-group .button{border-width:1px 0 0;border-radius:0}.action-sheet-group .button.active,.action-sheet-group .button:active{background-color:transparent;color:inherit}.action-sheet-group .button:first-child:last-child{border-width:0}.bar{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:absolute;right:0;left:0;z-index:10;box-sizing:border-box;padding:5px;width:100%;height:44px;border-width:0;border-style:solid;border-top:1px solid transparent;border-bottom:1px solid #ddd;background-color:#fff;background-size:0}@media (min--moz-device-pixel-ratio:1.5),(-webkit-min-device-pixel-ratio:1.5),(min-device-pixel-ratio:1.5),(min-resolution:144dpi),(min-resolution:1.5dppx){.bar{border:0;background-image:linear-gradient(0deg,#ddd,#ddd 50%,transparent 50%);background-position:bottom;background-size:100% 1px;background-repeat:no-repeat}}.bar.bar-clear{border:0;background:0 0;color:#fff}.bar.bar-clear .button,.bar.bar-clear .title{color:#fff}.bar.item-input-inset .item-input-wrapper{margin-top:-1px}.bar.item-input-inset .item-input-wrapper input{padding-left:8px;height:28px}.bar.bar-light{background-color:#fff;border-color:#ddd;background-image:linear-gradient(0deg,#ddd,#ddd 50%,transparent 50%);color:#444}.bar.bar-light .title{color:#444}.bar.bar-stable{background-color:#f8f8f8;border-color:#b2b2b2;background-image:linear-gradient(0deg,#b2b2b2,#b2b2b2 50%,transparent 50%);color:#444}.bar.bar-stable .title{color:#444}.bar.bar-positive{background-color:#4a87ee;border-color:#145dd7;background-image:linear-gradient(0deg,#145dd7,#145dd7 50%,transparent 50%);color:#fff}.bar.bar-positive .title{color:#fff}.bar.bar-calm{background-color:#43cee6;border-color:#1aaac3;background-image:linear-gradient(0deg,#1aaac3,#1aaac3 50%,transparent 50%);color:#fff}.bar.bar-calm .title{color:#fff}.bar.bar-assertive{background-color:#ef4e3a;border-color:#cc2511;background-image:linear-gradient(0deg,#cc2511,#cc2511 50%,transparent 50%);color:#fff}.bar.bar-assertive .title{color:#fff}.bar.bar-balanced{background-color:#6c3;border-color:#478f24;background-image:linear-gradient(0deg,#478f24,#478f24 50%,transparent 50%);color:#fff}.bar.bar-balanced .title{color:#fff}.bar.bar-energized{background-color:#f0b840;border-color:#d39511;background-image:linear-gradient(0deg,#d39511,#d39511 50%,transparent 50%);color:#fff}.bar.bar-energized .title{color:#fff}.bar.bar-royal{background-color:#8a6de9;border-color:#552bdf;background-image:linear-gradient(0deg,#552bdf,#552bdf 50%,transparent 50%);color:#fff}.bar.bar-royal .title{color:#fff}.bar.bar-dark{background-color:#444;border-color:#111;background-image:linear-gradient(0deg,#111,#111 50%,transparent 50%);color:#fff}.bar.bar-dark .title{color:#fff}.bar .title{position:absolute;top:0;right:0;left:0;z-index:0;overflow:hidden;margin:0 10px;min-width:30px;text-align:center;text-overflow:ellipsis;white-space:nowrap;font-size:18px;line-height:42px}.bar .title.title-left{text-align:left}.bar .title.title-right{text-align:right}.bar .title a{color:inherit}.bar .button{z-index:1;padding:0 8px;min-width:initial;min-height:31px;font-size:12px;line-height:30px}.bar .button .icon,.bar .button.icon-left:before,.bar .button.icon-right:before,.bar .button.icon:before{padding-right:2px;padding-left:2px;font-size:24px;line-height:30px}.bar .button.button-icon .icon,.bar .button.button-icon.icon-left:before,.bar .button.button-icon.icon-right:before,.bar .button.button-icon.icon:before{line-height:32px}.bar .button.button-clear{font-size:18px;padding-right:2px;padding-left:2px}.bar .button-bar>.button,.bar .buttons>.button{min-height:31px;line-height:30px}.bar .button+.button-bar,.bar .button-bar+.button{margin-left:5px}.bar .title+.button:last-child,.bar .title+.buttons,.bar>.button+.button:last-child,.bar>.button.pull-right{position:absolute;top:5px;right:5px;bottom:5px}.bar-light .button{color:#444;background-color:#fff;border-color:#ddd}.bar-light .button:hover{color:#444;text-decoration:none}.bar-light .button.active,.bar-light .button:active{background-color:#fafafa;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#ccc}.bar-light .button.button-clear{color:#444;background:0 0;border-color:transparent;box-shadow:none;font-size:18px}.bar-light .button.button-icon{background:0 0;border-color:transparent}.bar-stable .button{color:#444;background-color:#f8f8f8;border-color:#b2b2b2}.bar-stable .button:hover{color:#444;text-decoration:none}.bar-stable .button.active,.bar-stable .button:active{background-color:#e5e5e5;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#a2a2a2}.bar-stable .button.button-clear{color:#444;background:0 0;border-color:transparent;box-shadow:none;font-size:18px}.bar-stable .button.button-icon{background:0 0;border-color:transparent}.bar-positive .button{color:#fff;background-color:#4a87ee;border-color:#145dd7}.bar-positive .button:hover{color:#fff;text-decoration:none}.bar-positive .button.active,.bar-positive .button:active{background-color:#145dd7;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#145dd7}.bar-positive .button.button-clear{color:#fff;background:0 0;border-color:transparent;box-shadow:none;font-size:18px}.bar-positive .button.button-icon{background:0 0;border-color:transparent}.bar-calm .button{color:#fff;background-color:#43cee6;border-color:#1aaac3}.bar-calm .button:hover{color:#fff;text-decoration:none}.bar-calm .button.active,.bar-calm .button:active{background-color:#1aaac3;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#1aaac3}.bar-calm .button.button-clear{color:#fff;background:0 0;border-color:transparent;box-shadow:none;font-size:18px}.bar-calm .button.button-icon{background:0 0;border-color:transparent}.bar-assertive .button{color:#fff;background-color:#ef4e3a;border-color:#cc2511}.bar-assertive .button:hover{color:#fff;text-decoration:none}.bar-assertive .button.active,.bar-assertive .button:active{background-color:#cc2511;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#cc2511}.bar-assertive .button.button-clear{color:#fff;background:0 0;border-color:transparent;box-shadow:none;font-size:18px}.bar-assertive .button.button-icon{background:0 0;border-color:transparent}.bar-balanced .button{color:#fff;background-color:#6c3;border-color:#478f24}.bar-balanced .button:hover{color:#fff;text-decoration:none}.bar-balanced .button.active,.bar-balanced .button:active{background-color:#478f24;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#478f24}.bar-balanced .button.button-clear{color:#fff;background:0 0;border-color:transparent;box-shadow:none;font-size:18px}.bar-balanced .button.button-icon{background:0 0;border-color:transparent}.bar-energized .button{color:#fff;background-color:#f0b840;border-color:#d39511}.bar-energized .button:hover{color:#fff;text-decoration:none}.bar-energized .button.active,.bar-energized .button:active{background-color:#d39511;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#d39511}.bar-energized .button.button-clear{color:#fff;background:0 0;border-color:transparent;box-shadow:none;font-size:18px}.bar-energized .button.button-icon{background:0 0;border-color:transparent}.bar-royal .button{color:#fff;background-color:#8a6de9;border-color:#552bdf}.bar-royal .button:hover{color:#fff;text-decoration:none}.bar-royal .button.active,.bar-royal .button:active{background-color:#552bdf;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#552bdf}.bar-royal .button.button-clear{color:#fff;background:0 0;border-color:transparent;box-shadow:none;font-size:18px}.bar-royal .button.button-icon{background:0 0;border-color:transparent}.bar-dark .button{color:#fff;background-color:#444;border-color:#111}.bar-dark .button:hover{color:#fff;text-decoration:none}.bar-dark .button.active,.bar-dark .button:active{background-color:#262626;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#000}.bar-dark .button.button-clear{color:#fff;background:0 0;border-color:transparent;box-shadow:none;font-size:18px}.bar-dark .button.button-icon{background:0 0;border-color:transparent}.bar-header{top:0;border-top-width:0;border-bottom-width:1px}.bar-footer{bottom:0;border-top-width:1px;border-bottom-width:0;background-position:top}.bar-tabs{padding:0}.bar-subheader{top:44px;display:block}.bar-subfooter{bottom:44px;display:block}.tabs{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-direction:normal;-webkit-box-orient:horizontal;-webkit-flex-direction:horizontal;-moz-flex-direction:horizontal;-ms-flex-direction:horizontal;flex-direction:horizontal;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;-moz-justify-content:center;justify-content:center;background-color:#f8f8f8;background-image:linear-gradient(0deg,#b2b2b2,#b2b2b2 50%,transparent 50%);border-color:#b2b2b2;color:#444;position:absolute;bottom:0;z-index:5;width:100%;height:49px;border-style:solid;border-top-width:1px;background-size:0;line-height:49px}.tabs.tabs-light{background-color:#fff;background-image:linear-gradient(0deg,#ddd,#ddd 50%,transparent 50%);border-color:#ddd;color:#444}.tabs.tabs-stable{background-color:#f8f8f8;background-image:linear-gradient(0deg,#b2b2b2,#b2b2b2 50%,transparent 50%);border-color:#b2b2b2;color:#444}.tabs.tabs-positive{background-color:#4a87ee;background-image:linear-gradient(0deg,#145dd7,#145dd7 50%,transparent 50%);border-color:#145dd7;color:#fff}.tabs.tabs-calm{background-color:#43cee6;background-image:linear-gradient(0deg,#1aaac3,#1aaac3 50%,transparent 50%);border-color:#1aaac3;color:#fff}.tabs.tabs-assertive{background-color:#ef4e3a;background-image:linear-gradient(0deg,#cc2511,#cc2511 50%,transparent 50%);border-color:#cc2511;color:#fff}.tabs.tabs-balanced{background-color:#6c3;background-image:linear-gradient(0deg,#478f24,#478f24 50%,transparent 50%);border-color:#478f24;color:#fff}.tabs.tabs-energized{background-color:#f0b840;background-image:linear-gradient(0deg,#d39511,#d39511 50%,transparent 50%);border-color:#d39511;color:#fff}.tabs.tabs-royal{background-color:#8a6de9;background-image:linear-gradient(0deg,#552bdf,#552bdf 50%,transparent 50%);border-color:#552bdf;color:#fff}.tabs.tabs-dark{background-color:#444;background-image:linear-gradient(0deg,#111,#111 50%,transparent 50%);border-color:#111;color:#fff}@media (min--moz-device-pixel-ratio:1.5),(-webkit-min-device-pixel-ratio:1.5),(min-device-pixel-ratio:1.5),(min-resolution:144dpi),(min-resolution:1.5dppx){.tabs{padding-top:2px;border-top:0!important;border-bottom:0!important;background-position:top;background-size:100% 1px;background-repeat:no-repeat}}.tabs-top{top:44px}.tab-item{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;overflow:hidden;max-width:150px;height:100%;color:inherit;text-align:center;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;font-weight:400;font-size:14px;font-family:"Helvetica Neue-Light","Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,sans-serif;opacity:.7}.tabs-icon-bottom .tab-item,.tabs-icon-top .tab-item{font-size:12px;line-height:14px}.tab-item .icon{display:block;margin:0 auto;height:32px;font-size:32px}.tabs-icon-left .tab-item,.tabs-icon-right .tab-item{font-size:12px}.tabs-icon-left .tab-item .icon,.tabs-icon-right .tab-item .icon{display:inline-block;vertical-align:top;font-size:24px;line-height:49px}.tabs-icon-only .icon{line-height:inherit}.tab-item.active,.tab-item:active{opacity:1}.tab-item.active.tab-item-light,.tab-item:active.tab-item-light{color:#fff}.tab-item.active.tab-item-stable,.tab-item:active.tab-item-stable{color:#f8f8f8}.tab-item.active.tab-item-positive,.tab-item:active.tab-item-positive{color:#4a87ee}.tab-item.active.tab-item-calm,.tab-item:active.tab-item-calm{color:#43cee6}.tab-item.active.tab-item-assertive,.tab-item:active.tab-item-assertive{color:#ef4e3a}.tab-item.active.tab-item-balanced,.tab-item:active.tab-item-balanced{color:#6c3}.tab-item.active.tab-item-energized,.tab-item:active.tab-item-energized{color:#f0b840}.tab-item.active.tab-item-royal,.tab-item:active.tab-item-royal{color:#8a6de9}.tab-item.active.tab-item-dark,.tab-item:active.tab-item-dark{color:#444}.item.tabs{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;padding:0}.item.tabs .icon{position:relative}.menu{position:absolute;top:0;bottom:0;z-index:0;overflow:hidden;min-height:100%;max-height:100%;width:275px;background-color:#fff}.menu-content{box-shadow:-1px 0 2px rgba(0,0,0,.2),1px 0 2px rgba(0,0,0,.2)}.menu-left{left:0}.menu-right{right:0}.menu-animated{-webkit-transition:-webkit-transform 200ms ease;-moz-transition:-moz-transform 200ms ease;transition:transform 200ms ease}.modal{-webkit-transform:translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);position:fixed;top:0;z-index:10;overflow:hidden;min-height:100%;width:100%;background-color:#fff;opacity:0}.modal.active{height:100%}.popup{position:fixed}.popup-content{padding:10px}.loading-backdrop{-webkit-transition:visibility 0s linear .3s;-moz-transition:visibility 0s linear .3s;transition:visibility 0s linear .3s;position:fixed;top:0;left:0;visibility:hidden;width:100%;height:100%}.loading-backdrop.enabled{background-color:rgba(0,0,0,.7)}.loading-backdrop.active{-webkit-transition-delay:0s;-moz-transition-delay:0s;transition-delay:0s;visibility:visible}.loading{position:fixed;top:50%;left:50%;padding:20px;border-radius:5px;background-color:rgba(0,0,0,.7);color:#fff;text-align:center;text-overflow:ellipsis;font-size:15px}.loading h1,.loading h2,.loading h3,.loading h4,.loading h5,.loading h6{color:#fff}.item{color:#444;background-color:#fff;border-color:#ddd;-webkit-transition:margin-left .2s ease-in-out,margin-right .2s ease-in-out,left .2s ease-in-out;-moz-transition:margin-left .2s ease-in-out,margin-right .2s ease-in-out,left .2s ease-in-out;transition:margin-left .2s ease-in-out,margin-right .2s ease-in-out,left .2s ease-in-out;position:relative;z-index:2;display:block;margin:-1px;padding:15px;border-width:1px;border-style:solid;font-size:16px}.item h2{margin:0 0 4px;font-size:16px}.item h3{margin:0 0 4px;font-size:14px}.item h4{margin:0 0 4px;font-size:12px}.item h5,.item h6{margin:0 0 3px;font-size:10px}.item p{color:#666;font-size:14px}.item h1:last-child,.item h2:last-child,.item h3:last-child,.item h4:last-child,.item h5:last-child,.item h6:last-child,.item p:last-child{margin-bottom:0}.item .badge{float:right}.item .badge+.badge{margin-right:5px}.item.item-light{color:#444;background-color:#fff;border-color:#ddd}.item.item-stable{color:#444;background-color:#f8f8f8;border-color:#b2b2b2}.item.item-positive{color:#fff;background-color:#4a87ee;border-color:#145dd7}.item.item-calm{color:#fff;background-color:#43cee6;border-color:#1aaac3}.item.item-assertive{color:#fff;background-color:#ef4e3a;border-color:#cc2511}.item.item-balanced{color:#fff;background-color:#6c3;border-color:#478f24}.item.item-energized{color:#fff;background-color:#f0b840;border-color:#d39511}.item.item-royal{color:#fff;background-color:#8a6de9;border-color:#552bdf}.item.item-dark{color:#fff;background-color:#444;border-color:#111}.ionic-pseudo a.item:active,.ionic-pseudo button.item:active,a.item.active,button.item.active{background-color:#d9d9d9;border-color:#ccc}.ionic-pseudo a.item.item-light:active,.ionic-pseudo button.item.item-light:active,a.item.item-light.active,button.item.item-light.active{background-color:#fafafa;border-color:#ccc}.ionic-pseudo a.item.item-stable:active,.ionic-pseudo button.item.item-stable:active,a.item.item-stable.active,button.item.item-stable.active{background-color:#e5e5e5;border-color:#a2a2a2}.ionic-pseudo a.item.item-positive:active,.ionic-pseudo button.item.item-positive:active,a.item.item-positive.active,button.item.item-positive.active{background-color:#145dd7;border-color:#145dd7}.ionic-pseudo a.item.item-calm:active,.ionic-pseudo button.item.item-calm:active,a.item.item-calm.active,button.item.item-calm.active{background-color:#1aaac3;border-color:#1aaac3}.ionic-pseudo a.item.item-assertive:active,.ionic-pseudo button.item.item-assertive:active,a.item.item-assertive.active,button.item.item-assertive.active{background-color:#cc2511;border-color:#cc2511}.ionic-pseudo a.item.item-balanced:active,.ionic-pseudo button.item.item-balanced:active,a.item.item-balanced.active,button.item.item-balanced.active{background-color:#478f24;border-color:#478f24}.ionic-pseudo a.item.item-energized:active,.ionic-pseudo button.item.item-energized:active,a.item.item-energized.active,button.item.item-energized.active{background-color:#d39511;border-color:#d39511}.ionic-pseudo a.item.item-royal:active,.ionic-pseudo button.item.item-royal:active,a.item.item-royal.active,button.item.item-royal.active{background-color:#552bdf;border-color:#552bdf}.ionic-pseudo a.item.item-dark:active,.ionic-pseudo button.item.item-dark:active,a.item.item-dark.active,button.item.item-dark.active{background-color:#262626;border-color:#000}.item,.item h1,.item h2,.item h3,.item h4,.item h5,.item h6,.item p,.item-content,.item-content h1,.item-content h2,.item-content h3,.item-content h4,.item-content h5,.item-content h6,.item-content p{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}a.item{color:inherit;text-decoration:none}a.item:focus,a.item:hover{text-decoration:none}.item-complex,a.item.item-complex,button.item.item-complex{padding:0}.item-complex .item-content,.item-radio .item-content{-webkit-transition:all .1s ease-in-out;-moz-transition:all .1s ease-in-out;transition:all .1s ease-in-out;position:relative;z-index:2;padding:15px 40px 15px 15px;border:0;background-color:#fff}a.item-content{display:block;color:inherit;text-decoration:none}.item-body h1,.item-body h2,.item-body h3,.item-body h4,.item-body h5,.item-body h6,.item-body p,.item-complex.item-text-wrap .item-content,.item-text-wrap,.item-text-wrap h1,.item-text-wrap h2,.item-text-wrap h3,.item-text-wrap h4,.item-text-wrap h5,.item-text-wrap h6,.item-text-wrap p{overflow:hidden;white-space:normal}.item-complex.item-text-wrap,.item-complex.item-text-wrap h1,.item-complex.item-text-wrap h2,.item-complex.item-text-wrap h3,.item-complex.item-text-wrap h4,.item-complex.item-text-wrap h5,.item-complex.item-text-wrap h6,.item-complex.item-text-wrap p{overflow:hidden;white-space:nowrap}.item-icon-left .icon,.item-icon-right .icon{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:0;height:100%;font-size:32px}.item-icon-left .icon:before,.item-icon-right .icon:before{display:block;width:28px;text-align:center}.item .fill-icon{min-width:30px;min-height:30px;font-size:28px}.item-icon-left{padding-left:45px}.item-icon-left .icon{left:7.5px}.item-complex.item-icon-left{padding-left:0}.item-complex.item-icon-left .item-content{padding-left:45px}.item-icon-right{padding-right:45px}.item-icon-right .icon{right:7.5px}.item-complex.item-icon-right{padding-right:0}.item-complex.item-icon-right .item-content{padding-right:45px}.item-icon-left.item-icon-right .icon:first-child{right:auto}.item-icon-left.item-icon-right .icon:last-child{left:auto}.item-button-left{padding-left:67.5px}.item-button-left .item-content>.button,.item-button-left>.button{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:7.5px;left:7.5px;min-width:initial;min-height:32px;font-size:32px}.item-button-left .item-content>.button .icon,.item-button-left>.button .icon{position:relative;left:auto;width:auto;line-height:31px}.item-button-right,a.item.item-button-right,button.item.item-button-right{padding-right:75px}.item-button-right .item-content>.button,.item-button-right .item-content>.buttons,.item-button-right>.button,.item-button-right>.buttons{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:7.5px;right:15px;min-width:initial;min-height:32px;font-size:32px}.item-button-right .item-content>.button .icon,.item-button-right .item-content>.buttons .icon,.item-button-right>.button .icon,.item-button-right>.buttons .icon{position:relative;left:auto;width:auto;line-height:31px}.item-button-right .item-content>.button>.button,.item-button-right .item-content>.buttons>.button,.item-button-right>.button>.button,.item-button-right>.buttons>.button{margin:0 2px;min-height:32px;font-size:32px}a.item,button.item{padding-right:40px}a.item:after,button.item:after{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;-webkit-font-smoothing:antialiased;font-smoothing:antialiased;position:absolute;top:0;right:11px;height:100%;color:#ccc;content:"\f125";text-transform:none;font-weight:400;font-style:normal;font-variant:normal;font-size:16px;font-family:Ionicons;line-height:1;speak:none}a.item-button-right:after,a.item-icon-right:after,button.item-button-right:after,button.item-icon-right:after{display:none}.item-avatar{padding-left:70px;min-height:70px}.item-avatar .item-img,.item-avatar img:first-child{position:absolute;top:15px;left:15px;max-width:40px;max-height:40px;width:100%;border-radius:4px}.item-thumbnail-left{padding-left:105px;min-height:100px}.item-thumbnail-left>.item-image,.item-thumbnail-left>img:first-child{position:absolute;top:10px;left:10px;max-width:80px;max-height:80px;width:100%}.item-thumbnail-right{padding-right:105px;min-height:100px}.item-thumbnail-right>.item-image,.item-thumbnail-right>img:first-child{position:absolute;top:10px;right:10px;max-width:80px;max-height:80px;width:100%}.item-image{padding:0;text-align:center}.item-image .list-img,.item-image img:first-child{width:100%;vertical-align:middle}.item-body{overflow:auto;padding:15px;text-overflow:inherit;white-space:normal}.item-body h1,.item-body h2,.item-body h3,.item-body h4,.item-body h5,.item-body h6,.item-body p{margin-top:15px;margin-bottom:15px}.item-divider{padding-top:7.5px;padding-bottom:7.5px;min-height:30px;background-color:#f5f5f5;color:#222;font-weight:700}.item-note{float:right;color:#aaa;font-size:14px}.item-reordering{position:absolute;z-index:20;width:100%}.item-placeholder{opacity:.7}.item-edit{-webkit-transition:left .2s ease-in-out,opacity .2s ease-in-out;-moz-transition:left .2s ease-in-out,opacity .2s ease-in-out;transition:left .2s ease-in-out,opacity .2s ease-in-out;position:absolute;top:0;left:8px;z-index:0;width:48px;height:100%;line-height:100%}.item-edit .button{height:100%}.item-edit .button.icon{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:0;left:0;height:100%;color:#ef4e3a;font-size:24px}.item-edit.ng-enter{-webkit-transition:left .2s ease-in-out,opacity .2s ease-in-out;-moz-transition:left .2s ease-in-out,opacity .2s ease-in-out;transition:left .2s ease-in-out,opacity .2s ease-in-out;left:-48px;opacity:0}.item-edit.ng-enter-active{left:8px;opacity:1}.item-edit.ng-leave{-webkit-transition:left .2s ease-in-out,opacity .2s ease-in-out;-moz-transition:left .2s ease-in-out,opacity .2s ease-in-out;transition:left .2s ease-in-out,opacity .2s ease-in-out;left:0;opacity:1}.item-edit.ng-leave-active{left:-48px;opacity:0}.item-drag{position:absolute;top:0;right:0;z-index:0;width:50px;height:100%;background:inherit}.item-drag .button{min-width:42px;height:100%}.item-drag .button.icon:before{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:0;height:100%;font-size:32px}.item-options{position:absolute;top:0;right:0;z-index:1;height:100%}.item-options .button{height:100%;border:0;border-radius:0}.item-options-hide .item-options{display:none}.list{position:relative;margin-bottom:20px;padding-top:1px;padding-bottom:1px;padding-left:0}.list-editing .item-content{-webkit-transform:translate3d(50px,0,0);-moz-transform:translate3d(50px,0,0);transform:translate3d(50px,0,0)}.list-reordering .item-content{margin-right:50px}.list-reordering .item-drag{z-index:1}.list-header{margin-top:20px;padding:5px 15px;background-color:transparent;color:#222;font-weight:700}.card.list .list-item{padding-right:1px;padding-left:1px}.card,.list-inset{overflow:hidden;margin:20px 10px;border-radius:2px;background-color:#fff}.card{padding-top:1px;padding-bottom:1px;box-shadow:0 1px 1px rgba(0,0,0,.1)}.card .item:first-child,.card .item:first-child .item-content,.list-inset .item:first-child,.list-inset .item:first-child .item-content,.padding>.list .item:first-child,.padding>.list .item:first-child .item-content{border-top-left-radius:2px;border-top-right-radius:2px}.card .item:last-child,.card .item:last-child .item-content,.list-inset .item:last-child,.list-inset .item:last-child .item-content,.padding>.list .item:last-child,.padding>.list .item:last-child .item-content{border-bottom-right-radius:2px;border-bottom-left-radius:2px}.card .item:last-child,.list-inset .item:last-child{margin-bottom:-1px}.card .item,.list-inset .item,.padding-horizontal>.list .item,.padding>.list .item{margin-right:0;margin-left:0}.padding-left>.list .item{margin-left:0}.padding-right>.list .item{margin-right:0}.nav-page{position:absolute;width:100%;height:100%;background-color:#fff}.badge{background-color:transparent;color:#aaa;display:inline-block;padding:3px 8px;min-width:10px;border-radius:10px;vertical-align:baseline;text-align:center;white-space:nowrap;font-weight:700;font-size:14px;line-height:16px}.badge:empty{display:none}.badge.badge-light{background-color:#fff;color:#444}.badge.badge-stable{background-color:#f8f8f8;color:#444}.badge.badge-positive{background-color:#4a87ee;color:#fff}.badge.badge-calm{background-color:#43cee6;color:#fff}.badge.badge-assertive{background-color:#ef4e3a;color:#fff}.badge.badge-balanced{background-color:#6c3;color:#fff}.badge.badge-energized{background-color:#f0b840;color:#fff}.badge.badge-royal{background-color:#8a6de9;color:#fff}.badge.badge-dark{background-color:#444;color:#fff}.button .badge{position:relative;top:-1px}.slider{position:relative;overflow:hidden;visibility:hidden}.slider-slides{position:relative}.slider-slide{display:block;position:relative;width:100%;float:left;vertical-align:top}.slider-slide-image>img{width:100%}.slider-pager{position:absolute;bottom:20px;width:100%;text-align:center;z-index:1}.slider-pager .slider-pager-page{display:inline-block;margin:0 3px;width:15px;color:#fff;text-decoration:none;opacity:.3}.slider-pager .slider-pager-page.active{opacity:1;-webkit-transition:opacity .4s ease-in;-moz-transition:opacity .4s ease-in;transition:opacity .4s ease-in}.split-pane{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:stretch;-ms-flex-align:stretch;-webkit-align-items:stretch;-moz-align-items:stretch;align-items:stretch;width:100%;height:100%}.split-pane-menu{-webkit-box-flex:0;-webkit-flex:0 0 320px;-moz-box-flex:0;-moz-flex:0 0 320px;-ms-flex:0 0 320px;flex:0 0 320px;overflow-y:auto;width:320px;height:100%;border-right:1px solid #eee}@media all and (max-width:568px){.split-pane-menu{border-right:0}}.split-pane-content{-webkit-box-flex:1;-webkit-flex:1 0 auto;-moz-box-flex:1;-moz-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto}form{margin:0 0 1.42857}legend{display:block;margin-bottom:1.42857;padding:0;width:100%;border:1px solid #ddd;color:#444;font-size:21px;line-height:2.85714}legend small{color:#f8f8f8;font-size:1.07143}button,input,label,select,textarea{font-size:14px;font-weight:400;line-height:1.42857}button,input,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.item-input{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:relative;overflow:hidden;padding:6px 8px 5px}.item-input input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-flex:1;-webkit-flex:1 0 220px;-moz-box-flex:1;-moz-flex:1 0 220px;-ms-flex:1 0 220px;flex:1 0 220px;-webkit-appearance:none;-moz-appearance:none;appearance:none;margin:0;background-color:transparent}.item-input .button .icon{-webkit-box-flex:0;-webkit-flex:0 0 24px;-moz-box-flex:0;-moz-flex:0 0 24px;-ms-flex:0 0 24px;flex:0 0 24px;position:static;display:inline-block;height:auto;text-align:center;font-size:16px}.ionic-pseudo .item-input.item:active,.item-input.item.active{border-color:#ddd;background-color:transparent}.item-input .button-bar{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-flex:1;-webkit-flex:1 0 220px;-moz-box-flex:1;-moz-flex:1 0 220px;-ms-flex:1 0 220px;flex:1 0 220px;-webkit-appearance:none;-moz-appearance:none;appearance:none}.item-input-inset{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:relative;overflow:hidden;padding:10px}.item-input-wrapper{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1 0;-moz-box-flex:1;-moz-flex:1 0;-ms-flex:1 0;flex:1 0;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;padding-right:8px;padding-left:8px;background:#eee}.item-input-inset .item-input-wrapper input{padding-left:4px;height:29px;background:inherit;line-height:18px}.item-input-wrapper~.button{margin-left:10px}.input-label{-webkit-box-flex:1;-webkit-flex:1 0 100px;-moz-box-flex:1;-moz-flex:1 0 100px;-ms-flex:1 0 100px;flex:1 0 100px;padding:7px 10px 7px 3px;max-width:200px;color:#444;font-weight:700}.placeholder-icon{color:#aaa}.item-stacked-label{display:block;background-color:transparent;box-shadow:none}.item-stacked-label .icon,.item-stacked-label .input-label{display:inline-block;padding:4px 0;vertical-align:middle}.item-stacked-label input,.item-stacked-label textarea{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;overflow:hidden;padding:4px 8px 3px;border:0;background-color:#fff}.item-stacked-label input{height:46px}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{display:block;height:34px;color:#111;vertical-align:middle;font-size:14px;line-height:20px}input,textarea{width:100%}textarea{height:auto}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],textarea{border:0}input[type=checkbox],input[type=radio]{margin:0;line-height:normal}input[type=button],input[type=checkbox],input[type=file],input[type=image],input[type=radio],input[type=reset],input[type=submit]{width:auto}select[multiple],select[size]{height:auto}input[type=file],select{line-height:34px}select{border:1px solid #ddd;background-color:#fff}input:-moz-placeholder,textarea:-moz-placeholder{color:#aaa}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#aaa}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#aaa}input[disabled],input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{background-color:#f8f8f8;cursor:not-allowed}input[type=checkbox][disabled],input[type=checkbox][readonly],input[type=radio][disabled],input[type=radio][readonly]{background-color:transparent}.checkbox{position:relative;display:inline-block;padding:7px;cursor:pointer}.checkbox input{position:relative;width:28px;height:28px;border:0;background:0 0;cursor:pointer;-webkit-appearance:none}.checkbox input:before{display:table;width:100%;height:100%;border:1px solid #4a87ee;border-radius:50%;background:#fff;content:' ';transition:background-color .1s ease-in-out}.checkbox input:after{-webkit-transition:opacity .05s ease-in-out;-moz-transition:opacity .05s ease-in-out;transition:opacity .05s ease-in-out;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);transform:rotate(-45deg);position:absolute;top:34%;left:26%;display:table;width:14px;height:10.33333px;border:3px solid #fff;border-top:0;border-right:0;content:' ';opacity:0}.checkbox input:checked:before{border:0;background:#4a87ee}.checkbox input:checked:after{opacity:1}.item-checkbox{padding-left:58px}.item-checkbox.active,.item-checkbox:active{box-shadow:none}.item-checkbox .checkbox{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;position:absolute;top:0;left:7.5px;z-index:3;height:100%}.toggle{position:relative;display:inline-block}.toggle input{display:none}.toggle .track{-webkit-transition-timing-function:ease-in-out;-moz-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out;-webkit-transition-duration:.1s;-moz-transition-duration:.1s;transition-duration:.1s;-webkit-transition-property:background-color,border;-moz-transition-property:background-color,border;transition-property:background-color,border;display:inline-block;box-sizing:border-box;width:54px;height:32px;border:solid 2px #e5e5e5;border-radius:20px;background-color:#e5e5e5;content:' ';cursor:pointer}.toggle .handle{-webkit-transition:.1s ease-in-out;-moz-transition:.1s ease-in-out;transition:.1s ease-in-out;position:absolute;top:2px;left:2px;display:block;width:28px;height:28px;border-radius:50%;background-color:#fff}.toggle .handle:before{position:absolute;top:-4px;left:-22px;padding:19px 35px;content:" "}.toggle input:checked+.track{border-color:#4a87ee;background-color:#4a87ee}.toggle input:checked+.track .handle{-webkit-transform:translate3d(22px,0,0);-moz-transform:translate3d(22px,0,0);transform:translate3d(22px,0,0);background-color:#fff}.item-toggle{padding-right:99px}.item-toggle.active,.item-toggle:active{box-shadow:none}.item-toggle .toggle{position:absolute;top:7.5px;right:15px;z-index:3}.item-radio{padding:0}.item-radio:hover{cursor:pointer}.item-radio .item-content{padding-right:60px}.item-radio .radio-icon{position:absolute;top:0;right:0;z-index:3;visibility:hidden;padding:13px;height:100%;font-size:24px}.item-radio input{display:none}.item-radio input:checked~.item-content{background:#f7f7f7}.item-radio input:checked~.radio-icon{visibility:visible}input[type=range]{display:inline-block;overflow:hidden;margin-top:5px;margin-bottom:5px;padding-right:2px;padding-left:1px;width:auto;height:35px;outline:0;background:linear-gradient(to right,#ccc 0,#ccc 100%);background-position:center;background-size:99% 4px;background-repeat:no-repeat;-webkit-appearance:none}input[type=range]::-webkit-slider-thumb{position:relative;width:20px;height:20px;border-radius:10px;background-color:#fff;box-shadow:0 0 2px rgba(0,0,0,.5),1px 3px 5px rgba(0,0,0,.25);cursor:pointer;-webkit-appearance:none}input[type=range]::-webkit-slider-thumb:before{position:absolute;top:8px;left:-2001px;width:2000px;height:4px;background:#444;content:' '}input[type=range]::-webkit-slider-thumb:after{position:absolute;top:-20px;left:-20px;padding:30px;content:' '}.range{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center;padding:2px 4px}.range.range-light input::-webkit-slider-thumb:before{background:#ddd}.range.range-stable input::-webkit-slider-thumb:before{background:#b2b2b2}.range.range-positive input::-webkit-slider-thumb:before{background:#4a87ee}.range.range-calm input::-webkit-slider-thumb:before{background:#43cee6}.range.range-balanced input::-webkit-slider-thumb:before{background:#6c3}.range.range-assertive input::-webkit-slider-thumb:before{background:#ef4e3a}.range.range-energized input::-webkit-slider-thumb:before{background:#f0b840}.range.range-royal input::-webkit-slider-thumb:before{background:#8a6de9}.range.range-dark input::-webkit-slider-thumb:before{background:#444}.range .icon{-webkit-box-flex:0;-webkit-flex:0;-moz-box-flex:0;-moz-flex:0;-ms-flex:0;flex:0;display:block;min-width:24px;text-align:center;font-size:24px}.range input{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;margin-right:10px;margin-left:10px;width:100%}.range-label{-webkit-box-flex:0;-webkit-flex:0 0 auto;-moz-box-flex:0;-moz-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;display:block;white-space:nowrap}.range-label:first-child{padding-left:5px}.range input+.range-label{padding-right:5px;padding-left:0}.button{color:#444;background-color:#f8f8f8;border-color:#b2b2b2;position:relative;display:inline-block;margin:0;padding:1px 12px 0;min-width:52px;min-height:42px;border-width:1px;border-style:solid;border-radius:2px;vertical-align:top;text-align:center;text-overflow:ellipsis;font-size:16px;line-height:41px;cursor:pointer}.button:hover{color:#444;text-decoration:none}.button.active,.button:active{background-color:#e5e5e5;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#a2a2a2}.button .icon,.button.icon-left:before,.button.icon-right:before,.button.icon:before{display:inline-block;padding:0 0 1px;vertical-align:inherit;font-size:24px;line-height:40px}.button.icon-left:before{padding-right:.2em;padding-left:0}.button.icon-right:before{float:right;padding-right:0;padding-left:.2em}.button.button-block,.button.button-full{margin-top:10px;margin-bottom:10px}.button.button-light{color:#444;background-color:#fff;border-color:#ddd}.button.button-light:hover{color:#444;text-decoration:none}.button.button-light.active,.button.button-light:active{background-color:#fafafa;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#ccc}.button.button-light.button-clear{color:#ddd;background:0 0;border-color:transparent;box-shadow:none}.button.button-light.button-icon{background:0 0;border-color:transparent}.button.button-light.button-outline{background:0 0;border-color:#ddd;color:#ddd}.button.button-light.button-outline.active,.button.button-light.button-outline:active{background-color:#ddd;color:#fff;box-shadow:none}.button.button-stable{color:#444;background-color:#f8f8f8;border-color:#b2b2b2}.button.button-stable:hover{color:#444;text-decoration:none}.button.button-stable.active,.button.button-stable:active{background-color:#e5e5e5;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#a2a2a2}.button.button-stable.button-clear{color:#b2b2b2;background:0 0;border-color:transparent;box-shadow:none}.button.button-stable.button-icon{background:0 0;border-color:transparent}.button.button-stable.button-outline{background:0 0;border-color:#b2b2b2;color:#b2b2b2}.button.button-stable.button-outline.active,.button.button-stable.button-outline:active{background-color:#b2b2b2;color:#fff;box-shadow:none}.button.button-positive{color:#fff;background-color:#4a87ee;border-color:#145dd7}.button.button-positive:hover{color:#fff;text-decoration:none}.button.button-positive.active,.button.button-positive:active{background-color:#145dd7;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#145dd7}.button.button-positive.button-clear{color:#4a87ee;background:0 0;border-color:transparent;box-shadow:none}.button.button-positive.button-icon{background:0 0;border-color:transparent}.button.button-positive.button-outline{background:0 0;border-color:#4a87ee;color:#4a87ee}.button.button-positive.button-outline.active,.button.button-positive.button-outline:active{background-color:#4a87ee;color:#fff;box-shadow:none}.button.button-calm{color:#fff;background-color:#43cee6;border-color:#1aaac3}.button.button-calm:hover{color:#fff;text-decoration:none}.button.button-calm.active,.button.button-calm:active{background-color:#1aaac3;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#1aaac3}.button.button-calm.button-clear{color:#43cee6;background:0 0;border-color:transparent;box-shadow:none}.button.button-calm.button-icon{background:0 0;border-color:transparent}.button.button-calm.button-outline{background:0 0;border-color:#43cee6;color:#43cee6}.button.button-calm.button-outline.active,.button.button-calm.button-outline:active{background-color:#43cee6;color:#fff;box-shadow:none}.button.button-assertive{color:#fff;background-color:#ef4e3a;border-color:#cc2511}.button.button-assertive:hover{color:#fff;text-decoration:none}.button.button-assertive.active,.button.button-assertive:active{background-color:#cc2511;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#cc2511}.button.button-assertive.button-clear{color:#ef4e3a;background:0 0;border-color:transparent;box-shadow:none}.button.button-assertive.button-icon{background:0 0;border-color:transparent}.button.button-assertive.button-outline{background:0 0;border-color:#ef4e3a;color:#ef4e3a}.button.button-assertive.button-outline.active,.button.button-assertive.button-outline:active{background-color:#ef4e3a;color:#fff;box-shadow:none}.button.button-balanced{color:#fff;background-color:#6c3;border-color:#478f24}.button.button-balanced:hover{color:#fff;text-decoration:none}.button.button-balanced.active,.button.button-balanced:active{background-color:#478f24;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#478f24}.button.button-balanced.button-clear{color:#6c3;background:0 0;border-color:transparent;box-shadow:none}.button.button-balanced.button-icon{background:0 0;border-color:transparent}.button.button-balanced.button-outline{background:0 0;border-color:#6c3;color:#6c3}.button.button-balanced.button-outline.active,.button.button-balanced.button-outline:active{background-color:#6c3;color:#fff;box-shadow:none}.button.button-energized{color:#fff;background-color:#f0b840;border-color:#d39511}.button.button-energized:hover{color:#fff;text-decoration:none}.button.button-energized.active,.button.button-energized:active{background-color:#d39511;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#d39511}.button.button-energized.button-clear{color:#f0b840;background:0 0;border-color:transparent;box-shadow:none}.button.button-energized.button-icon{background:0 0;border-color:transparent}.button.button-energized.button-outline{background:0 0;border-color:#f0b840;color:#f0b840}.button.button-energized.button-outline.active,.button.button-energized.button-outline:active{background-color:#f0b840;color:#fff;box-shadow:none}.button.button-royal{color:#fff;background-color:#8a6de9;border-color:#552bdf}.button.button-royal:hover{color:#fff;text-decoration:none}.button.button-royal.active,.button.button-royal:active{background-color:#552bdf;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#552bdf}.button.button-royal.button-clear{color:#8a6de9;background:0 0;border-color:transparent;box-shadow:none}.button.button-royal.button-icon{background:0 0;border-color:transparent}.button.button-royal.button-outline{background:0 0;border-color:#8a6de9;color:#8a6de9}.button.button-royal.button-outline.active,.button.button-royal.button-outline:active{background-color:#8a6de9;color:#fff;box-shadow:none}.button.button-dark{color:#fff;background-color:#444;border-color:#111}.button.button-dark:hover{color:#fff;text-decoration:none}.button.button-dark.active,.button.button-dark:active{background-color:#262626;box-shadow:inset 0 1px 3px rgba(0,0,0,.15);border-color:#000}.button.button-dark.button-clear{color:#444;background:0 0;border-color:transparent;box-shadow:none}.button.button-dark.button-icon{background:0 0;border-color:transparent}.button.button-dark.button-outline{background:0 0;border-color:#444;color:#444}.button.button-dark.button-outline.active,.button.button-dark.button-outline:active{background-color:#444;color:#fff;box-shadow:none}.button-small{padding:0 4px;min-width:28px;min-height:28px;font-size:12px;line-height:27px}.button-small .icon,.button-small.icon-left:before,.button-small.icon-right:before,.button-small.icon:before{font-size:16px;line-height:26px}.button-large{padding:0 16px;min-width:66px;min-height:54px;font-size:18px;line-height:53px}.button-large .icon,.button-large.icon-left:before,.button-large.icon-right:before,.button-large.icon:before{padding-bottom:2px;font-size:32px;line-height:51px}.button-icon{-webkit-transition:opacity .1s;-moz-transition:opacity .1s;transition:opacity .1s;padding:0 6px;min-width:initial;border-color:transparent;background:0 0}.button-icon.button.active,.button-icon.button:active{border-color:transparent;background:0 0;box-shadow:none;opacity:.3}.button-icon .icon,.button-icon.icon:before{font-size:32px}.button-clear{-webkit-transition:opacity .1s;-moz-transition:opacity .1s;transition:opacity .1s;padding:0 6px;max-height:42px;border-color:transparent;background:0 0;box-shadow:none}.button-clear.button-clear{color:#b2b2b2;background:0 0;border-color:transparent;box-shadow:none}.button-clear.button-icon{background:0 0;border-color:transparent}.button-clear.active,.button-clear:active{opacity:.3}.button-outline{-webkit-transition:opacity .1s;-moz-transition:opacity .1s;transition:opacity .1s;background:0 0;box-shadow:none}.button-outline.button-outline{background:0 0;border-color:#b2b2b2;color:#b2b2b2}.button-outline.button-outline.active,.button-outline.button-outline:active{background-color:#b2b2b2;color:#fff;box-shadow:none}.padding>.button.button-block:first-child{margin-top:0}.button-block{display:block;clear:both}.button-block:after{display:block;visibility:hidden;clear:both;height:0;content:"."}.button-full,.button-full>.button{display:block;margin-right:0;margin-left:0;border-right-width:0;border-left-width:0;border-radius:0}.button-full>button.button,button.button-block,button.button-full{width:100%}a.button{text-decoration:none}.button-bar{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;width:100%}.button-bar.button-bar-inline{display:block;width:auto;*zoom:1}.button-bar.button-bar-inline:after,.button-bar.button-bar-inline:before{display:table;content:"";line-height:0}.button-bar.button-bar-inline:after{clear:both}.button-bar.button-bar-inline>.button{width:auto;display:inline-block;float:left}.button-bar>.button{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;overflow:hidden;padding:0 16px;width:0;border-width:1px 0 1px 1px;border-radius:0;text-align:center;text-overflow:ellipsis;white-space:nowrap}.button-bar>.button:first-child{border-radius:2px 0 0 2px}.button-bar>.button:last-child{border-right-width:1px;border-radius:0 2px 2px 0}@-webkit-keyframes slideInUp{0%{-webkit-transform:translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);opacity:0}100%{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}}@-webkit-keyframes slideOutUp{0%{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}100%{-webkit-transform:translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);opacity:0}}@-webkit-keyframes slideInFromLeft{from{-webkit-transform:translate3d(-100%,0,0)}to{-webkit-transform:translate3d(0,0,0)}}@-moz-keyframes slideInFromLeft{from{-moz-transform:translateX(-100%)}to{-moz-transform:translateX(0)}}@keyframes slideInFromLeft{from{transform:translateX(-100%)}to{transform:translateX(0)}}@-webkit-keyframes slideInFromRight{from{-webkit-transform:translate3d(100%,0,0)}to{-webkit-transform:translate3d(0,0,0)}}@-moz-keyframes slideInFromRight{from{-moz-transform:translateX(100%)}to{-moz-transform:translateX(0)}}@keyframes slideInFromRight{from{transform:translateX(100%)}to{transform:translateX(0)}}@-webkit-keyframes slideOutToleft{from{-webkit-transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(-100%,0,0)}}@-moz-keyframes slideOutToleft{from{-moz-transform:translateX(0)}to{-moz-transform:translateX(-100%)}}@keyframes slideOutToLeft{from{transform:translateX(0)}to{transform:translateX(-100%)}}@-webkit-keyframes slideOutToRight{from{-webkit-transform:translate3d(0,0,0)}to{-webkit-transform:translate3d(100%,0,0)}}@-moz-keyframes slideOutToRight{from{-moz-transform:translateX(0)}to{-moz-transform:translateX(100%)}}@keyframes slideOutToRight{from{transform:translateX(0)}to{transform:translateX(100%)}}@-webkit-keyframes fadeOut{from{opacity:1}to{opacity:0}}@-moz-keyframes fadeOut{from{opacity:1}to{opacity:0}}@keyframes fadeOut{from{opacity:1}to{opacity:0}}@-webkit-keyframes fadeIn{from{opacity:0}to{opacity:1}}@-moz-keyframes fadeIn{from{opacity:0}to{opacity:1}}@keyframes fadeIn{from{opacity:0}to{opacity:1}}@-webkit-keyframes spin{100%{-webkit-transform:rotate(360deg)}}@-moz-keyframes spin{100%{-moz-transform:rotate(360deg)}}@keyframes spin{100%{transform:rotate(360deg)}}.no-animation.ng-enter,.no-animation.ng-leave,.no-animation>.ng-enter,.no-animation>.ng-leave{-webkit-transition:none;-moz-transition:none;transition:none}.noop-animation.ng-enter,.noop-animation.ng-leave,.noop-animation>.ng-enter,.noop-animation>.ng-leave{-webkit-transition:all cubic-bezier(0.25,.46,.45,.94) 250ms;-moz-transition:all cubic-bezier(0.25,.46,.45,.94) 250ms;transition:all cubic-bezier(0.25,.46,.45,.94) 250ms;position:absolute;top:0;right:0;bottom:0;left:0}.ng-animate .pane{position:absolute}.slide-left-right.ng-enter,.slide-left-right.ng-leave,.slide-left-right>.ng-enter,.slide-left-right>.ng-leave{-webkit-transition:all ease-in-out 250ms;-moz-transition:all ease-in-out 250ms;transition:all ease-in-out 250ms;position:absolute;top:0;right:0;bottom:0;left:0}.slide-left-right.ng-enter,.slide-left-right>.ng-enter{-webkit-transform:translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.slide-left-right.ng-enter.ng-enter-active,.slide-left-right>.ng-enter.ng-enter-active{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.slide-left-right.ng-leave.ng-leave-active,.slide-left-right>.ng-leave.ng-leave-active{-webkit-transform:translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.slide-left-right.reverse.ng-enter,.slide-left-right.reverse.ng-leave,.slide-left-right.reverse>.ng-enter,.slide-left-right.reverse>.ng-leave{-webkit-transition:all ease-in-out 250ms;-moz-transition:all ease-in-out 250ms;transition:all ease-in-out 250ms;position:absolute;top:0;right:0;bottom:0;left:0}.slide-left-right.reverse.ng-enter,.slide-left-right.reverse>.ng-enter{-webkit-transform:translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.slide-left-right.reverse.ng-enter.ng-enter-active,.slide-left-right.reverse>.ng-enter.ng-enter-active{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.slide-left-right.reverse.ng-leave.ng-leave-active,.slide-left-right.reverse>.ng-leave.ng-leave-active{-webkit-transform:translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.slide-left-right-ios7.ng-enter,.slide-left-right-ios7.ng-leave,.slide-left-right-ios7>.ng-enter,.slide-left-right-ios7>.ng-leave{-webkit-transition:all ease-in-out 250ms;-moz-transition:all ease-in-out 250ms;transition:all ease-in-out 250ms;position:absolute;top:0;right:-1px;bottom:0;left:-1px;border-left:1px solid #ddd;border-right:1px solid #ddd}.slide-left-right-ios7.ng-enter,.slide-left-right-ios7>.ng-enter{-webkit-transform:translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.slide-left-right-ios7.ng-enter.ng-enter-active,.slide-left-right-ios7>.ng-enter.ng-enter-active{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.slide-left-right-ios7.ng-leave.ng-leave-active,.slide-left-right-ios7>.ng-leave.ng-leave-active{-webkit-transform:translate3d(-15%,0,0);-moz-transform:translate3d(-15%,0,0);transform:translate3d(-15%,0,0)}.slide-left-right-ios7.reverse.ng-enter,.slide-left-right-ios7.reverse.ng-leave,.slide-left-right-ios7.reverse>.ng-enter,.slide-left-right-ios7.reverse>.ng-leave{-webkit-transition:all ease-in-out 250ms;-moz-transition:all ease-in-out 250ms;transition:all ease-in-out 250ms;position:absolute;top:0;right:-1px;bottom:0;left:-1px;border-left:1px solid #ddd;border-right:1px solid #ddd}.slide-left-right-ios7.reverse.ng-enter,.slide-left-right-ios7.reverse>.ng-enter{-webkit-transform:translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.slide-left-right-ios7.reverse.ng-enter.ng-enter-active,.slide-left-right-ios7.reverse>.ng-enter.ng-enter-active{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.slide-left-right-ios7.reverse.ng-leave.ng-leave-active,.slide-left-right-ios7.reverse>.ng-leave.ng-leave-active{-webkit-transform:translate3d(15%,0,0);-moz-transform:translate3d(15%,0,0);transform:translate3d(15%,0,0)}.slide-in-left{-webkit-transform:translate3d(0%,0,0);-moz-transform:translate3d(0%,0,0);transform:translate3d(0%,0,0)}.slide-in-left.ng-enter,.slide-in-left>.ng-enter{-webkit-animation-name:slideInFromLeft;-moz-animation-name:slideInFromLeft;animation-name:slideInFromLeft;-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-in-left.ng-leave,.slide-in-left>.ng-leave{-webkit-animation-name:slideOutToLeft;-moz-animation-name:slideOutToLeft;animation-name:slideOutToLeft;-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-in-left-add{-webkit-transform:translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-in-left-add-active{-webkit-animation-name:slideInFromLeft;-moz-animation-name:slideInFromLeft;animation-name:slideInFromLeft}.slide-out-left{-webkit-transform:translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.slide-out-left.ng-enter,.slide-out-left.ng-leave,.slide-out-left>.ng-enter,.slide-out-left>.ng-leave{-webkit-animation-name:slideOutToLeft;-moz-animation-name:slideOutToLeft;animation-name:slideOutToLeft;-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-out-left-add{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-out-left-add-active{-webkit-animation-name:slideOutToLeft;-moz-animation-name:slideOutToLeft;animation-name:slideOutToLeft}.slide-in-right{-webkit-transform:translate3d(0%,0,0);-moz-transform:translate3d(0%,0,0);transform:translate3d(0%,0,0)}.slide-in-right.ng-enter,.slide-in-right.ng-leave,.slide-in-right>.ng-enter,.slide-in-right>.ng-leave{-webkit-animation-name:slideInFromRight;-moz-animation-name:slideInFromRight;animation-name:slideInFromRight;-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-in-right-add{-webkit-transform:translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-in-right-add-active{-webkit-animation-name:slideInFromRight;-moz-animation-name:slideInFromRight;animation-name:slideInFromRight}.slide-out-right{-webkit-transform:translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.slide-out-right.ng-enter,.slide-out-right.ng-leave,.slide-out-right>.ng-enter,.slide-out-right>.ng-leave{-webkit-animation-name:slideOutToRight;-moz-animation-name:slideOutToRight;animation-name:slideOutToRight;-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-out-right-add{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-animation-duration:250ms;-moz-animation-duration:250ms;animation-duration:250ms;-webkit-animation-timing-function:ease-in-out;-moz-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-out-right-add-active{-webkit-animation-name:slideOutToRight;-moz-animation-name:slideOutToRight;animation-name:slideOutToRight}.slide-in-up{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.slide-in-up .ng-enter,.slide-in-up.ng-enter{-webkit-transform:translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);-webkit-animation-duration:400ms;-moz-animation-duration:400ms;animation-duration:400ms;-webkit-animation-timing-function:cubic-bezier(0.1,.7,.1,1);-moz-animation-timing-function:cubic-bezier(0.1,.7,.1,1);animation-timing-function:cubic-bezier(0.1,.7,.1,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both;opacity:0}.slide-in-up .ng-enter-active,.slide-in-up.ng-enter-active{-webkit-animation-name:slideInUp;-moz-animation-name:slideInUp;animation-name:slideInUp}.slide-in-up .ng-leave,.slide-in-up.ng-leave{-webkit-animation-duration:400ms;-moz-animation-duration:400ms;animation-duration:400ms;-webkit-animation-timing-function:cubic-bezier(0.1,.7,.1,1);-moz-animation-timing-function:cubic-bezier(0.1,.7,.1,1);animation-timing-function:cubic-bezier(0.1,.7,.1,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-in-up .ng-leave,.slide-in-up.ng-leave-active{-webkit-animation-name:slideOutUp;-moz-animation-name:slideOutUp;animation-name:slideOutUp}.slide-in-up-add{-webkit-animation-duration:400ms;-moz-animation-duration:400ms;animation-duration:400ms;-webkit-animation-timing-function:cubic-bezier(0.1,.7,.1,1);-moz-animation-timing-function:cubic-bezier(0.1,.7,.1,1);animation-timing-function:cubic-bezier(0.1,.7,.1,1);-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;animation-fill-mode:both}.slide-in-up-add-active{-webkit-animation-name:slideInUp;-moz-animation-name:slideInUp;animation-name:slideInUp}.slide-in-up-remove{-webkit-animation-duration:400ms;-moz-animation-duration:400ms;animation-duration:400ms;-webkit-animation-timing-function:cubic-bezier(0.1,.7,.1,1);-moz-animation-timing-function:cubic-bezier(0.1,.7,.1,1);animation-timing-function:cubic-bezier(0.1,.7,.1,1);-webkit-animation-fill-mode:forwards;-moz-animation-fill-mode:forwards;animation-fill-mode:forwards}.slide-in-up-remove-active{-webkit-animation-name:slideOutUp;-moz-animation-name:slideOutUp;animation-name:slideOutUp}.fade-in{-webkit-animation:fadeOut .3s;-moz-animation:fadeOut .3s;animation:fadeOut .3s}.fade-in.active{-webkit-animation:fadeIn .3s;-moz-animation:fadeIn .3s;animation:fadeIn .3s}.fade-in-not-out .ng-enter,.fade-in-not-out.ng-enter{-webkit-animation:fadeIn .3s;-moz-animation:fadeIn .3s;animation:fadeIn .3s;position:relative}.fade-in-not-out .ng-leave,.fade-in-not-out.ng-leave{display:none}.nav-title-slide-ios7.ng-enter,.nav-title-slide-ios7.ng-leave,.nav-title-slide-ios7>.ng-enter,.nav-title-slide-ios7>.ng-leave{-webkit-transition:all 350ms;-moz-transition:all 350ms;transition:all 350ms;-webkit-transition-timing-function:ease-in-out;-moz-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out;opacity:1}.nav-title-slide-ios7.ng-enter,.nav-title-slide-ios7>.ng-enter{-webkit-transform:translate3d(30%,0,0);-moz-transform:translate3d(30%,0,0);transform:translate3d(30%,0,0);opacity:0}.nav-title-slide-ios7.ng-enter.ng-enter-active,.nav-title-slide-ios7>.ng-enter.ng-enter-active{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.nav-title-slide-ios7.ng-leave.ng-leave-active,.nav-title-slide-ios7>.ng-leave.ng-leave-active{-webkit-transform:translate3d(-30%,0,0);-moz-transform:translate3d(-30%,0,0);transform:translate3d(-30%,0,0);opacity:0}.reverse .nav-title-slide-ios7.ng-enter,.reverse .nav-title-slide-ios7.ng-leave,.reverse .nav-title-slide-ios7>.ng-enter,.reverse .nav-title-slide-ios7>.ng-leave{-webkit-transition:all 350ms;-moz-transition:all 350ms;transition:all 350ms;-webkit-transition-timing-function:ease-in-out;-moz-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out;opacity:1}.reverse .nav-title-slide-ios7.ng-enter,.reverse .nav-title-slide-ios7>.ng-enter{-webkit-transform:translate3d(-30%,0,0);-moz-transform:translate3d(-30%,0,0);transform:translate3d(-30%,0,0);opacity:0}.reverse .nav-title-slide-ios7.ng-enter.ng-enter-active,.reverse .nav-title-slide-ios7>.ng-enter.ng-enter-active{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.reverse .nav-title-slide-ios7.ng-leave.ng-leave-active,.reverse .nav-title-slide-ios7>.ng-leave.ng-leave-active{-webkit-transform:translate3d(30%,0,0);-moz-transform:translate3d(30%,0,0);transform:translate3d(30%,0,0);opacity:0}.row{display:-webkit-box;display:-webkit-flex;display:-moz-box;display:-moz-flex;display:-ms-flexbox;display:flex;padding:5px;width:100%}.row+.row{margin-top:-5px;padding-top:0}.col{-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;-moz-flex:1;-ms-flex:1;flex:1;display:block;padding:5px;width:100%}.row-top{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;-moz-align-items:flex-start;align-items:flex-start}.row-bottom{-webkit-box-align:end;-ms-flex-align:end;-webkit-align-items:flex-end;-moz-align-items:flex-end;align-items:flex-end}.row-center{-webkit-box-align:center;-ms-flex-align:center;-webkit-align-items:center;-moz-align-items:center;align-items:center}.col-top{-webkit-align-self:flex-start;-moz-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.col-bottom{-webkit-align-self:flex-end;-moz-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end}.col-center{-webkit-align-self:center;-moz-align-self:center;-ms-flex-item-align:center;align-self:center}.col-offset-10{margin-left:10%}.col-offset-20{margin-left:20%}.col-offset-25{margin-left:25%}.col-offset-33,.col-offset-34{margin-left:33.3333%}.col-offset-50{margin-left:50%}.col-offset-66,.col-offset-67{margin-left:66.6666%}.col-offset-75{margin-left:75%}.col-offset-80{margin-left:80%}.col-offset-90{margin-left:90%}.col-10{-webkit-box-flex:0;-webkit-flex:0 0 10%;-moz-box-flex:0;-moz-flex:0 0 10%;-ms-flex:0 0 10%;flex:0 0 10%;max-width:10%}.col-20{-webkit-box-flex:0;-webkit-flex:0 0 20%;-moz-box-flex:0;-moz-flex:0 0 20%;-ms-flex:0 0 20%;flex:0 0 20%;max-width:20%}.col-25{-webkit-box-flex:0;-webkit-flex:0 0 25%;-moz-box-flex:0;-moz-flex:0 0 25%;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-33,.col-34{-webkit-box-flex:0;-webkit-flex:0 0 33.3333%;-moz-box-flex:0;-moz-flex:0 0 33.3333%;-ms-flex:0 0 33.3333%;flex:0 0 33.3333%;max-width:33.3333%}.col-50{-webkit-box-flex:0;-webkit-flex:0 0 50%;-moz-box-flex:0;-moz-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-66,.col-67{-webkit-box-flex:0;-webkit-flex:0 0 66.6666%;-moz-box-flex:0;-moz-flex:0 0 66.6666%;-ms-flex:0 0 66.6666%;flex:0 0 66.6666%;max-width:66.6666%}.col-75{-webkit-box-flex:0;-webkit-flex:0 0 75%;-moz-box-flex:0;-moz-flex:0 0 75%;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-80{-webkit-box-flex:0;-webkit-flex:0 0 80%;-moz-box-flex:0;-moz-flex:0 0 80%;-ms-flex:0 0 80%;flex:0 0 80%;max-width:80%}.col-90{-webkit-box-flex:0;-webkit-flex:0 0 90%;-moz-box-flex:0;-moz-flex:0 0 90%;-ms-flex:0 0 90%;flex:0 0 90%;max-width:90%}.hidden,.hide{display:none}.show{display:block}.invisible{visibility:hidden}.inline{display:inline-block}.block{display:block;clear:both}.block:after{display:block;visibility:hidden;clear:both;height:0;content:"."}.full-image{width:100%}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:"";line-height:0}.clearfix:after{clear:both}.padding{padding:10px}.padding-top,.padding-vertical{padding-top:10px}.padding-horizontal,.padding-right{padding-right:10px}.padding-bottom,.padding-vertical{padding-bottom:10px}.padding-horizontal,.padding-left{padding-left:10px}.rounded{border-radius:4px}.light,a.light{color:#fff}.light-bg{background-color:#fff}.light-border{border-color:#ddd}.stable,a.stable{color:#f8f8f8}.stable-bg{background-color:#f8f8f8}.stable-border{border-color:#b2b2b2}.positive,a.positive{color:#4a87ee}.positive-bg{background-color:#4a87ee}.positive-border{border-color:#145dd7}.calm,a.calm{color:#43cee6}.calm-bg{background-color:#43cee6}.calm-border{border-color:#1aaac3}.assertive,a.assertive{color:#ef4e3a}.assertive-bg{background-color:#ef4e3a}.assertive-border{border-color:#cc2511}.balanced,a.balanced{color:#6c3}.balanced-bg{background-color:#6c3}.balanced-border{border-color:#478f24}.energized,a.energized{color:#f0b840}.energized-bg{background-color:#f0b840}.energized-border{border-color:#d39511}.royal,a.royal{color:#8a6de9}.royal-bg{background-color:#8a6de9}.royal-border{border-color:#552bdf}.dark,a.dark{color:#444}.dark-bg{background-color:#444}.dark-border{border-color:#111}.platform-ios7 .bar-header{height:64px}.platform-ios7 .bar-header>*{margin-top:20px}.platform-ios7 .bar-subheader,.platform-ios7 .has-header{top:64px}.platform-ios7 .has-subheader{top:108px}.platform-android .bar-header{height:48px}.platform-android .bar-subheader,.platform-android .has-header{top:48px}.platform-android .has-subheader{top:96px}.platform-android .title{line-height:48px}
|
@@ -0,0 +1,150 @@
|
|
1
|
+
@charset "UTF-8";
|
2
|
+
/*!
|
3
|
+
* Copyright 2013 Drifty Co.
|
4
|
+
* http://drifty.com/
|
5
|
+
|
6
|
+
* Ionic - a powerful HTML5 mobile app framework.
|
7
|
+
* http://ionicframework.com/
|
8
|
+
*
|
9
|
+
*
|
10
|
+
* By @maxlynch, @helloimben, @adamdbradley <3
|
11
|
+
*
|
12
|
+
* Licensed under the MIT license. Please see LICENSE for more information.
|
13
|
+
*
|
14
|
+
*/
|
15
|
+
/**
|
16
|
+
* Nav controllers and header bar animations
|
17
|
+
*/
|
18
|
+
/*
|
19
|
+
.content-slide-in {
|
20
|
+
&.ng-enter, > .ng-enter {
|
21
|
+
-webkit-transition: 0.5s ease-in-out all;
|
22
|
+
-webkit-transform:translate3d(100%,0,0) ;
|
23
|
+
box-shadow: -1px 0px 10px rgba(0,0,0,0.6);
|
24
|
+
}
|
25
|
+
&.ng-enter-active, > .ng-enter-active {
|
26
|
+
-webkit-transform:translate3d(0,0,0) ;
|
27
|
+
}
|
28
|
+
&.ng-leave, > .ng-leave {
|
29
|
+
-webkit-transition: 0.5s ease-in-out all;
|
30
|
+
-webkit-transform:translate3d(0%,0,0);
|
31
|
+
}
|
32
|
+
&.ng-leave-active, > .ng-leave-active {
|
33
|
+
-webkit-transform:translate3d(-10%,0,0);
|
34
|
+
opacity: 0.8;
|
35
|
+
}
|
36
|
+
}
|
37
|
+
*/
|
38
|
+
.content-slide-out.ng-enter, .content-slide-out > .ng-enter {
|
39
|
+
z-index: 1;
|
40
|
+
-webkit-transition: 0.5s ease-in-out all;
|
41
|
+
-webkit-transform: translate3d(-100%, 0, 0);
|
42
|
+
box-shadow: -1px 0px 10px rgba(0, 0, 0, 0.6); }
|
43
|
+
.content-slide-out.ng-enter-active, .content-slide-out > .ng-enter-active {
|
44
|
+
-webkit-transform: translate3d(0, 0, 0); }
|
45
|
+
.content-slide-out.ng-leave, .content-slide-out > .ng-leave {
|
46
|
+
z-index: 0;
|
47
|
+
-webkit-transition: 0.5s ease-in-out all;
|
48
|
+
-webkit-transform: translate3d(0%, 0, 0); }
|
49
|
+
.content-slide-out.ng-leave-active, .content-slide-out > .ng-leave-active {
|
50
|
+
-webkit-transform: translate3d(10%, 0, 0);
|
51
|
+
opacity: 0.8; }
|
52
|
+
|
53
|
+
.bar-title-in-add {
|
54
|
+
-webkit-transition: -webkit-transform 0.5s ease-in-out, opacity 0.5s ease-in-out;
|
55
|
+
-webkit-transform: translate3d(100%, 0, 0);
|
56
|
+
opacity: 0; }
|
57
|
+
|
58
|
+
.bar-title-in-add-active {
|
59
|
+
-webkit-transform: translate3d(0px, 0, 0);
|
60
|
+
opacity: 1; }
|
61
|
+
|
62
|
+
.bar-title-out-add {
|
63
|
+
-webkit-transition: -webkit-transform 0.5s ease-in-out, opacity 0.5s ease-in-out; }
|
64
|
+
|
65
|
+
.bar-title-out-add-active {
|
66
|
+
-webkit-transform: translate3d(-100%, 0, 0);
|
67
|
+
opacity: 0; }
|
68
|
+
|
69
|
+
.bar-button-in {
|
70
|
+
opacity: 0; }
|
71
|
+
|
72
|
+
.bar-button-in-add {
|
73
|
+
-webkit-transition: -webkit-transform 0.5s ease-in-out, opacity 0.5s ease-in-out;
|
74
|
+
-webkit-transform: translate3d(50%, 0, 0);
|
75
|
+
opacity: 0; }
|
76
|
+
|
77
|
+
.bar-button-in-active {
|
78
|
+
-webkit-transform: translate3d(0px, 0, 0);
|
79
|
+
opacity: 1; }
|
80
|
+
|
81
|
+
/**
|
82
|
+
* Tab controller animations
|
83
|
+
*/
|
84
|
+
.fade-in-out.ng-enter, .fade-in-out > .ng-enter {
|
85
|
+
opacity: 0;
|
86
|
+
-webkit-transition: opacity 0.3s ease-in-out; }
|
87
|
+
.fade-in-out.ng-enter-active, .fade-in-out > .ng-enter-active {
|
88
|
+
opacity: 1; }
|
89
|
+
.fade-in-out.ng-leave, .fade-in-out > .ng-leave {
|
90
|
+
opacity: 1;
|
91
|
+
-webkit-transition: opacity 0.3s ease-in-out; }
|
92
|
+
.fade-in-out.ng-leave-active, .fade-in-out > .ng-leave-active {
|
93
|
+
opacity: 0; }
|
94
|
+
|
95
|
+
/* the overall container of the toggle */
|
96
|
+
.toggle {
|
97
|
+
display: inline-block; }
|
98
|
+
|
99
|
+
/* hide the actual checkbox */
|
100
|
+
.toggle input {
|
101
|
+
display: none; }
|
102
|
+
|
103
|
+
.toggle .track {
|
104
|
+
/* the background of the toggle's track area */
|
105
|
+
/* also the track appearance when the toggle is "off" */
|
106
|
+
position: relative;
|
107
|
+
display: inline-block;
|
108
|
+
box-sizing: border-box;
|
109
|
+
width: 54px;
|
110
|
+
height: 32px;
|
111
|
+
border: solid 2px #dddddd;
|
112
|
+
border-radius: 20px;
|
113
|
+
background-color: white;
|
114
|
+
cursor: pointer;
|
115
|
+
transition: 0.4s ease; }
|
116
|
+
|
117
|
+
.toggle .handle {
|
118
|
+
/* the handle (circle) thats inside the toggle's track area */
|
119
|
+
/* also the appearance when the handle is "off" */
|
120
|
+
position: absolute;
|
121
|
+
display: block;
|
122
|
+
width: auto;
|
123
|
+
/* override defaults */
|
124
|
+
height: auto;
|
125
|
+
/* override defaults */
|
126
|
+
box-shadow: 0 0 2px rgba(0, 0, 0, 0.5), 0 4px 5px rgba(0, 0, 0, 0.25);
|
127
|
+
border-radius: 20px;
|
128
|
+
background-color: white;
|
129
|
+
left: 0;
|
130
|
+
top: 0;
|
131
|
+
bottom: 0;
|
132
|
+
right: 20px;
|
133
|
+
transition: 0.2s ease;
|
134
|
+
transition-property: left, right;
|
135
|
+
transition-delay: 0s, .05s; }
|
136
|
+
|
137
|
+
.toggle :checked + .track {
|
138
|
+
/* When the toggle is "on" */
|
139
|
+
/* the track when the toggle is "on" */
|
140
|
+
border-color: #4bd863;
|
141
|
+
background-color: #ccc;
|
142
|
+
box-shadow: inset 0 0 0 20px #4bd863;
|
143
|
+
transition: 0.2s ease;
|
144
|
+
/* the handle when the toggle is "on" */ }
|
145
|
+
.toggle :checked + .track .handle {
|
146
|
+
background-color: white;
|
147
|
+
right: 0;
|
148
|
+
left: 20px;
|
149
|
+
-webkit-transform: none;
|
150
|
+
transition-delay: .05s, 0s; }
|
@@ -0,0 +1,13 @@
|
|
1
|
+
@charset "UTF-8";/*!
|
2
|
+
* Copyright 2013 Drifty Co.
|
3
|
+
* http://drifty.com/
|
4
|
+
|
5
|
+
* Ionic - a powerful HTML5 mobile app framework.
|
6
|
+
* http://ionicframework.com/
|
7
|
+
*
|
8
|
+
*
|
9
|
+
* By @maxlynch, @helloimben, @adamdbradley <3
|
10
|
+
*
|
11
|
+
* Licensed under the MIT license. Please see LICENSE for more information.
|
12
|
+
*
|
13
|
+
*/.content-slide-out.ng-enter,.content-slide-out>.ng-enter{z-index:1;-webkit-transition:.5s ease-in-out all;-webkit-transform:translate3d(-100%,0,0);box-shadow:-1px 0 10px rgba(0,0,0,.6)}.content-slide-out.ng-enter-active,.content-slide-out>.ng-enter-active{-webkit-transform:translate3d(0,0,0)}.content-slide-out.ng-leave,.content-slide-out>.ng-leave{z-index:0;-webkit-transition:.5s ease-in-out all;-webkit-transform:translate3d(0%,0,0)}.content-slide-out.ng-leave-active,.content-slide-out>.ng-leave-active{-webkit-transform:translate3d(10%,0,0);opacity:.8}.bar-title-in-add{-webkit-transition:-webkit-transform .5s ease-in-out,opacity .5s ease-in-out;-webkit-transform:translate3d(100%,0,0);opacity:0}.bar-title-in-add-active{-webkit-transform:translate3d(0px,0,0);opacity:1}.bar-title-out-add{-webkit-transition:-webkit-transform .5s ease-in-out,opacity .5s ease-in-out}.bar-title-out-add-active{-webkit-transform:translate3d(-100%,0,0);opacity:0}.bar-button-in{opacity:0}.bar-button-in-add{-webkit-transition:-webkit-transform .5s ease-in-out,opacity .5s ease-in-out;-webkit-transform:translate3d(50%,0,0);opacity:0}.bar-button-in-active{-webkit-transform:translate3d(0px,0,0);opacity:1}.fade-in-out.ng-enter,.fade-in-out>.ng-enter{opacity:0;-webkit-transition:opacity .3s ease-in-out}.fade-in-out.ng-enter-active,.fade-in-out>.ng-enter-active{opacity:1}.fade-in-out.ng-leave,.fade-in-out>.ng-leave{opacity:1;-webkit-transition:opacity .3s ease-in-out}.fade-in-out.ng-leave-active,.fade-in-out>.ng-leave-active{opacity:0}.toggle{display:inline-block}.toggle input{display:none}.toggle .track{position:relative;display:inline-block;box-sizing:border-box;width:54px;height:32px;border:solid 2px #ddd;border-radius:20px;background-color:#fff;cursor:pointer;transition:.4s ease}.toggle .handle{position:absolute;display:block;width:auto;height:auto;box-shadow:0 0 2px rgba(0,0,0,.5),0 4px 5px rgba(0,0,0,.25);border-radius:20px;background-color:#fff;left:0;top:0;bottom:0;right:20px;transition:.2s ease;transition-property:left,right;transition-delay:0s,.05s}.toggle :checked+.track{border-color:#4bd863;background-color:#ccc;box-shadow:inset 0 0 0 20px #4bd863;transition:.2s ease}.toggle :checked+.track .handle{background-color:#fff;right:0;left:20px;-webkit-transform:none;transition-delay:.05s,0s}
|
data/gem-public_cert.pem
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
-----BEGIN CERTIFICATE-----
|
2
|
-
|
2
|
+
MIIDMDCCAhigAwIBAgIBADANBgkqhkiG9w0BAQUFADA+MRAwDgYDVQQDDAd5amNo
|
3
3
|
ZW54MRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJk/IsZAEZFgNjb20w
|
4
|
-
|
4
|
+
HhcNMTMwMjA3MDEyODI4WhcNMTQwMjA3MDEyODI4WjA+MRAwDgYDVQQDDAd5amNo
|
5
5
|
ZW54MRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJk/IsZAEZFgNjb20w
|
6
6
|
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDfzdtQlNyw5y9701pRrdCM
|
7
7
|
jVWGAMJ7Dyat2mjDVGhMsH/be4j8yn97pa6mymIQUzQaU1KQCw8V+FdV0h4p7HOp
|
@@ -9,13 +9,12 @@ zj3/mXF1UlcBL5EtItydy36vdanDHdfGbzIYMpnJsGA5ZNDWrBXWL9iQfkurMecq
|
|
9
9
|
v/w5r80KIaZkl2xMW8jnt33MXHEBjCASWd1yBMlzf1AOr75d0k2bYsSU+GExxexY
|
10
10
|
hPFzLMRM/VJxqitFbYnlgH5zyqBOcBmG3Hd0VaRi137XjBF4ferj21iX/RV4NIOZ
|
11
11
|
Hz2YbTVz80NJNHOpZDlSNE4vnIANp5fnmwNkAi3PTMxYZC89jWDABbqE783xWZkP
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
YSYVM5S6Ue7H5LNdQfdeyQ==
|
12
|
+
AgMBAAGjOTA3MAkGA1UdEwQCMAAwHQYDVR0OBBYEFAUvZi7fEySk49HTErbfMB2K
|
13
|
+
S4igMAsGA1UdDwQEAwIEsDANBgkqhkiG9w0BAQUFAAOCAQEAgUkiFf7KQbGt1lUq
|
14
|
+
jQiV8nol30+dWSIQ0/aTNN1lbgaKXq86Jqp9IIWbQ9oQLHuemXq0Fx7abrdIqJAw
|
15
|
+
QC7UleZtxRfT8pk3TIFOiinGbWlG/iJS85Pv0DWnAT3cl76M/r4M+QHOu38VAOJy
|
16
|
+
6rUHWia/9IzAJZZ8PtOPi0HkTwZIvpS6jLF6jeq2wr+Q8naQZ6S/JnalBe6n7dLS
|
17
|
+
LOEp3WwLafBZ9VtIQk/vgB3QJxor8X4R3IAsVvC2YkGwJ09qFV3WQWWZSSXRJyj5
|
18
|
+
0DwU+KfUta4HWRr+jl+4kYeiUKgamdv2pQ4VaJ83VGC3FIpUk9TULCM3v5iHbDQu
|
19
|
+
oZsWCQ==
|
21
20
|
-----END CERTIFICATE-----
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ionic-rails-engine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.17
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yen-Ju Chen
|
@@ -10,9 +10,9 @@ bindir: bin
|
|
10
10
|
cert_chain:
|
11
11
|
- |
|
12
12
|
-----BEGIN CERTIFICATE-----
|
13
|
-
|
13
|
+
MIIDMDCCAhigAwIBAgIBADANBgkqhkiG9w0BAQUFADA+MRAwDgYDVQQDDAd5amNo
|
14
14
|
ZW54MRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJk/IsZAEZFgNjb20w
|
15
|
-
|
15
|
+
HhcNMTMwMjA3MDEyODI4WhcNMTQwMjA3MDEyODI4WjA+MRAwDgYDVQQDDAd5amNo
|
16
16
|
ZW54MRUwEwYKCZImiZPyLGQBGRYFZ21haWwxEzARBgoJkiaJk/IsZAEZFgNjb20w
|
17
17
|
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDfzdtQlNyw5y9701pRrdCM
|
18
18
|
jVWGAMJ7Dyat2mjDVGhMsH/be4j8yn97pa6mymIQUzQaU1KQCw8V+FdV0h4p7HOp
|
@@ -20,17 +20,16 @@ cert_chain:
|
|
20
20
|
v/w5r80KIaZkl2xMW8jnt33MXHEBjCASWd1yBMlzf1AOr75d0k2bYsSU+GExxexY
|
21
21
|
hPFzLMRM/VJxqitFbYnlgH5zyqBOcBmG3Hd0VaRi137XjBF4ferj21iX/RV4NIOZ
|
22
22
|
Hz2YbTVz80NJNHOpZDlSNE4vnIANp5fnmwNkAi3PTMxYZC89jWDABbqE783xWZkP
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
YSYVM5S6Ue7H5LNdQfdeyQ==
|
23
|
+
AgMBAAGjOTA3MAkGA1UdEwQCMAAwHQYDVR0OBBYEFAUvZi7fEySk49HTErbfMB2K
|
24
|
+
S4igMAsGA1UdDwQEAwIEsDANBgkqhkiG9w0BAQUFAAOCAQEAgUkiFf7KQbGt1lUq
|
25
|
+
jQiV8nol30+dWSIQ0/aTNN1lbgaKXq86Jqp9IIWbQ9oQLHuemXq0Fx7abrdIqJAw
|
26
|
+
QC7UleZtxRfT8pk3TIFOiinGbWlG/iJS85Pv0DWnAT3cl76M/r4M+QHOu38VAOJy
|
27
|
+
6rUHWia/9IzAJZZ8PtOPi0HkTwZIvpS6jLF6jeq2wr+Q8naQZ6S/JnalBe6n7dLS
|
28
|
+
LOEp3WwLafBZ9VtIQk/vgB3QJxor8X4R3IAsVvC2YkGwJ09qFV3WQWWZSSXRJyj5
|
29
|
+
0DwU+KfUta4HWRr+jl+4kYeiUKgamdv2pQ4VaJ83VGC3FIpUk9TULCM3v5iHbDQu
|
30
|
+
oZsWCQ==
|
32
31
|
-----END CERTIFICATE-----
|
33
|
-
date:
|
32
|
+
date: 2013-12-17 00:00:00.000000000 Z
|
34
33
|
dependencies:
|
35
34
|
- !ruby/object:Gem::Dependency
|
36
35
|
name: railties
|
@@ -62,16 +61,14 @@ files:
|
|
62
61
|
- app/assets/fonts/ionic/ionicons.svg
|
63
62
|
- app/assets/fonts/ionic/ionicons.ttf
|
64
63
|
- app/assets/fonts/ionic/ionicons.woff
|
65
|
-
- app/assets/javascripts/angular-ui/angular-ui-router.js
|
66
|
-
- app/assets/javascripts/angular-ui/angular-ui-router.min.js
|
67
64
|
- app/assets/javascripts/ionic/ionic-angular.js
|
68
65
|
- app/assets/javascripts/ionic/ionic-angular.min.js
|
69
|
-
- app/assets/javascripts/ionic/ionic.bundle.js
|
70
|
-
- app/assets/javascripts/ionic/ionic.bundle.min.js
|
71
66
|
- app/assets/javascripts/ionic/ionic.js
|
72
67
|
- app/assets/javascripts/ionic/ionic.min.js
|
73
68
|
- app/assets/stylesheets/ionic/ionic.css.erb
|
74
69
|
- app/assets/stylesheets/ionic/ionic.min.css.erb
|
70
|
+
- app/assets/stylesheets/ionic/themes/ionic-ios7.css
|
71
|
+
- app/assets/stylesheets/ionic/themes/ionic-ios7.min.css
|
75
72
|
- gem-public_cert.pem
|
76
73
|
- ionic-rails-engine.gemspec
|
77
74
|
- lib/ionic-rails-engine.rb
|
metadata.gz.sig
CHANGED
@@ -1,2 +1,3 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
Z��F�z-8����تG6�n��\4��Z�k?�Pd���]^r��/�<��M�m�^S)�0c�B��5I�Dbȇ|���<veܥ�! ���΄37ϙ.�ϐѪ��뚤l�ż��i�i�����Rl�
|
2
|
+
g��P!�WH�U�D�v�^�Ա�u
|
3
|
+
|lY�1�]�z%IS�{��if�){d�]0dKԉ����%�x`�%�2��A�)uJ�i4�y����V��/�b+��!���ʕq&}�1<���
|
@@ -1,3223 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* State-based routing for AngularJS
|
3
|
-
* @version v0.2.10
|
4
|
-
* @link http://angular-ui.github.com/
|
5
|
-
* @license MIT License, http://www.opensource.org/licenses/MIT
|
6
|
-
*/
|
7
|
-
|
8
|
-
/* commonjs package manager support (eg componentjs) */
|
9
|
-
if (typeof module !== "undefined" && typeof exports !== "undefined" && module.exports === exports){
|
10
|
-
module.exports = 'ui.router';
|
11
|
-
}
|
12
|
-
|
13
|
-
(function (window, angular, undefined) {
|
14
|
-
/*jshint globalstrict:true*/
|
15
|
-
/*global angular:false*/
|
16
|
-
'use strict';
|
17
|
-
|
18
|
-
var isDefined = angular.isDefined,
|
19
|
-
isFunction = angular.isFunction,
|
20
|
-
isString = angular.isString,
|
21
|
-
isObject = angular.isObject,
|
22
|
-
isArray = angular.isArray,
|
23
|
-
forEach = angular.forEach,
|
24
|
-
extend = angular.extend,
|
25
|
-
copy = angular.copy;
|
26
|
-
|
27
|
-
function inherit(parent, extra) {
|
28
|
-
return extend(new (extend(function() {}, { prototype: parent }))(), extra);
|
29
|
-
}
|
30
|
-
|
31
|
-
function merge(dst) {
|
32
|
-
forEach(arguments, function(obj) {
|
33
|
-
if (obj !== dst) {
|
34
|
-
forEach(obj, function(value, key) {
|
35
|
-
if (!dst.hasOwnProperty(key)) dst[key] = value;
|
36
|
-
});
|
37
|
-
}
|
38
|
-
});
|
39
|
-
return dst;
|
40
|
-
}
|
41
|
-
|
42
|
-
/**
|
43
|
-
* Finds the common ancestor path between two states.
|
44
|
-
*
|
45
|
-
* @param {Object} first The first state.
|
46
|
-
* @param {Object} second The second state.
|
47
|
-
* @return {Array} Returns an array of state names in descending order, not including the root.
|
48
|
-
*/
|
49
|
-
function ancestors(first, second) {
|
50
|
-
var path = [];
|
51
|
-
|
52
|
-
for (var n in first.path) {
|
53
|
-
if (first.path[n] !== second.path[n]) break;
|
54
|
-
path.push(first.path[n]);
|
55
|
-
}
|
56
|
-
return path;
|
57
|
-
}
|
58
|
-
|
59
|
-
/**
|
60
|
-
* IE8-safe wrapper for `Object.keys()`.
|
61
|
-
*
|
62
|
-
* @param {Object} object A JavaScript object.
|
63
|
-
* @return {Array} Returns the keys of the object as an array.
|
64
|
-
*/
|
65
|
-
function keys(object) {
|
66
|
-
if (Object.keys) {
|
67
|
-
return Object.keys(object);
|
68
|
-
}
|
69
|
-
var result = [];
|
70
|
-
|
71
|
-
angular.forEach(object, function(val, key) {
|
72
|
-
result.push(key);
|
73
|
-
});
|
74
|
-
return result;
|
75
|
-
}
|
76
|
-
|
77
|
-
/**
|
78
|
-
* IE8-safe wrapper for `Array.prototype.indexOf()`.
|
79
|
-
*
|
80
|
-
* @param {Array} array A JavaScript array.
|
81
|
-
* @param {*} value A value to search the array for.
|
82
|
-
* @return {Number} Returns the array index value of `value`, or `-1` if not present.
|
83
|
-
*/
|
84
|
-
function arraySearch(array, value) {
|
85
|
-
if (Array.prototype.indexOf) {
|
86
|
-
return array.indexOf(value, Number(arguments[2]) || 0);
|
87
|
-
}
|
88
|
-
var len = array.length >>> 0, from = Number(arguments[2]) || 0;
|
89
|
-
from = (from < 0) ? Math.ceil(from) : Math.floor(from);
|
90
|
-
|
91
|
-
if (from < 0) from += len;
|
92
|
-
|
93
|
-
for (; from < len; from++) {
|
94
|
-
if (from in array && array[from] === value) return from;
|
95
|
-
}
|
96
|
-
return -1;
|
97
|
-
}
|
98
|
-
|
99
|
-
/**
|
100
|
-
* Merges a set of parameters with all parameters inherited between the common parents of the
|
101
|
-
* current state and a given destination state.
|
102
|
-
*
|
103
|
-
* @param {Object} currentParams The value of the current state parameters ($stateParams).
|
104
|
-
* @param {Object} newParams The set of parameters which will be composited with inherited params.
|
105
|
-
* @param {Object} $current Internal definition of object representing the current state.
|
106
|
-
* @param {Object} $to Internal definition of object representing state to transition to.
|
107
|
-
*/
|
108
|
-
function inheritParams(currentParams, newParams, $current, $to) {
|
109
|
-
var parents = ancestors($current, $to), parentParams, inherited = {}, inheritList = [];
|
110
|
-
|
111
|
-
for (var i in parents) {
|
112
|
-
if (!parents[i].params || !parents[i].params.length) continue;
|
113
|
-
parentParams = parents[i].params;
|
114
|
-
|
115
|
-
for (var j in parentParams) {
|
116
|
-
if (arraySearch(inheritList, parentParams[j]) >= 0) continue;
|
117
|
-
inheritList.push(parentParams[j]);
|
118
|
-
inherited[parentParams[j]] = currentParams[parentParams[j]];
|
119
|
-
}
|
120
|
-
}
|
121
|
-
return extend({}, inherited, newParams);
|
122
|
-
}
|
123
|
-
|
124
|
-
/**
|
125
|
-
* Normalizes a set of values to string or `null`, filtering them by a list of keys.
|
126
|
-
*
|
127
|
-
* @param {Array} keys The list of keys to normalize/return.
|
128
|
-
* @param {Object} values An object hash of values to normalize.
|
129
|
-
* @return {Object} Returns an object hash of normalized string values.
|
130
|
-
*/
|
131
|
-
function normalize(keys, values) {
|
132
|
-
var normalized = {};
|
133
|
-
|
134
|
-
forEach(keys, function (name) {
|
135
|
-
var value = values[name];
|
136
|
-
normalized[name] = (value != null) ? String(value) : null;
|
137
|
-
});
|
138
|
-
return normalized;
|
139
|
-
}
|
140
|
-
|
141
|
-
/**
|
142
|
-
* Performs a non-strict comparison of the subset of two objects, defined by a list of keys.
|
143
|
-
*
|
144
|
-
* @param {Object} a The first object.
|
145
|
-
* @param {Object} b The second object.
|
146
|
-
* @param {Array} keys The list of keys within each object to compare. If the list is empty or not specified,
|
147
|
-
* it defaults to the list of keys in `a`.
|
148
|
-
* @return {Boolean} Returns `true` if the keys match, otherwise `false`.
|
149
|
-
*/
|
150
|
-
function equalForKeys(a, b, keys) {
|
151
|
-
if (!keys) {
|
152
|
-
keys = [];
|
153
|
-
for (var n in a) keys.push(n); // Used instead of Object.keys() for IE8 compatibility
|
154
|
-
}
|
155
|
-
|
156
|
-
for (var i=0; i<keys.length; i++) {
|
157
|
-
var k = keys[i];
|
158
|
-
if (a[k] != b[k]) return false; // Not '===', values aren't necessarily normalized
|
159
|
-
}
|
160
|
-
return true;
|
161
|
-
}
|
162
|
-
|
163
|
-
/**
|
164
|
-
* Returns the subset of an object, based on a list of keys.
|
165
|
-
*
|
166
|
-
* @param {Array} keys
|
167
|
-
* @param {Object} values
|
168
|
-
* @return {Boolean} Returns a subset of `values`.
|
169
|
-
*/
|
170
|
-
function filterByKeys(keys, values) {
|
171
|
-
var filtered = {};
|
172
|
-
|
173
|
-
forEach(keys, function (name) {
|
174
|
-
filtered[name] = values[name];
|
175
|
-
});
|
176
|
-
return filtered;
|
177
|
-
}
|
178
|
-
/**
|
179
|
-
* @ngdoc overview
|
180
|
-
* @name ui.router.util
|
181
|
-
*
|
182
|
-
* @description
|
183
|
-
* # ui.router.util sub-module
|
184
|
-
*
|
185
|
-
* This module is a dependency of other sub-modules. Do not include this module as a dependency
|
186
|
-
* in your angular app (use {@link ui.router} module instead).
|
187
|
-
*
|
188
|
-
*/
|
189
|
-
angular.module('ui.router.util', ['ng']);
|
190
|
-
|
191
|
-
/**
|
192
|
-
* @ngdoc overview
|
193
|
-
* @name ui.router.router
|
194
|
-
*
|
195
|
-
* @requires ui.router.util
|
196
|
-
*
|
197
|
-
* @description
|
198
|
-
* # ui.router.router sub-module
|
199
|
-
*
|
200
|
-
* This module is a dependency of other sub-modules. Do not include this module as a dependency
|
201
|
-
* in your angular app (use {@link ui.router} module instead).
|
202
|
-
*/
|
203
|
-
angular.module('ui.router.router', ['ui.router.util']);
|
204
|
-
|
205
|
-
/**
|
206
|
-
* @ngdoc overview
|
207
|
-
* @name ui.router.state
|
208
|
-
*
|
209
|
-
* @requires ui.router.router
|
210
|
-
* @requires ui.router.util
|
211
|
-
*
|
212
|
-
* @description
|
213
|
-
* # ui.router.state sub-module
|
214
|
-
*
|
215
|
-
* This module is a dependency of the main ui.router module. Do not include this module as a dependency
|
216
|
-
* in your angular app (use {@link ui.router} module instead).
|
217
|
-
*
|
218
|
-
*/
|
219
|
-
angular.module('ui.router.state', ['ui.router.router', 'ui.router.util']);
|
220
|
-
|
221
|
-
/**
|
222
|
-
* @ngdoc overview
|
223
|
-
* @name ui.router
|
224
|
-
*
|
225
|
-
* @requires ui.router.state
|
226
|
-
*
|
227
|
-
* @description
|
228
|
-
* # ui.router
|
229
|
-
*
|
230
|
-
* ## The main module for ui.router
|
231
|
-
* There are several sub-modules included with the ui.router module, however only this module is needed
|
232
|
-
* as a dependency within your angular app. The other modules are for organization purposes.
|
233
|
-
*
|
234
|
-
* The modules are:
|
235
|
-
* * ui.router - the main "umbrella" module
|
236
|
-
* * ui.router.router -
|
237
|
-
*
|
238
|
-
* *You'll need to include **only** this module as the dependency within your angular app.*
|
239
|
-
*
|
240
|
-
* <pre>
|
241
|
-
* <!doctype html>
|
242
|
-
* <html ng-app="myApp">
|
243
|
-
* <head>
|
244
|
-
* <script src="js/angular.js"></script>
|
245
|
-
* <!-- Include the ui-router script -->
|
246
|
-
* <script src="js/angular-ui-router.min.js"></script>
|
247
|
-
* <script>
|
248
|
-
* // ...and add 'ui.router' as a dependency
|
249
|
-
* var myApp = angular.module('myApp', ['ui.router']);
|
250
|
-
* </script>
|
251
|
-
* </head>
|
252
|
-
* <body>
|
253
|
-
* </body>
|
254
|
-
* </html>
|
255
|
-
* </pre>
|
256
|
-
*/
|
257
|
-
angular.module('ui.router', ['ui.router.state']);
|
258
|
-
|
259
|
-
angular.module('ui.router.compat', ['ui.router']);
|
260
|
-
|
261
|
-
/**
|
262
|
-
* @ngdoc object
|
263
|
-
* @name ui.router.util.$resolve
|
264
|
-
*
|
265
|
-
* @requires $q
|
266
|
-
* @requires $injector
|
267
|
-
*
|
268
|
-
* @description
|
269
|
-
* Manages resolution of (acyclic) graphs of promises.
|
270
|
-
*/
|
271
|
-
$Resolve.$inject = ['$q', '$injector'];
|
272
|
-
function $Resolve( $q, $injector) {
|
273
|
-
|
274
|
-
var VISIT_IN_PROGRESS = 1,
|
275
|
-
VISIT_DONE = 2,
|
276
|
-
NOTHING = {},
|
277
|
-
NO_DEPENDENCIES = [],
|
278
|
-
NO_LOCALS = NOTHING,
|
279
|
-
NO_PARENT = extend($q.when(NOTHING), { $$promises: NOTHING, $$values: NOTHING });
|
280
|
-
|
281
|
-
|
282
|
-
/**
|
283
|
-
* @ngdoc function
|
284
|
-
* @name ui.router.util.$resolve#study
|
285
|
-
* @methodOf ui.router.util.$resolve
|
286
|
-
*
|
287
|
-
* @description
|
288
|
-
* Studies a set of invocables that are likely to be used multiple times.
|
289
|
-
* <pre>
|
290
|
-
* $resolve.study(invocables)(locals, parent, self)
|
291
|
-
* </pre>
|
292
|
-
* is equivalent to
|
293
|
-
* <pre>
|
294
|
-
* $resolve.resolve(invocables, locals, parent, self)
|
295
|
-
* </pre>
|
296
|
-
* but the former is more efficient (in fact `resolve` just calls `study`
|
297
|
-
* internally).
|
298
|
-
*
|
299
|
-
* @param {object} invocables Invocable objects
|
300
|
-
* @return {function} a function to pass in locals, parent and self
|
301
|
-
*/
|
302
|
-
this.study = function (invocables) {
|
303
|
-
if (!isObject(invocables)) throw new Error("'invocables' must be an object");
|
304
|
-
|
305
|
-
// Perform a topological sort of invocables to build an ordered plan
|
306
|
-
var plan = [], cycle = [], visited = {};
|
307
|
-
function visit(value, key) {
|
308
|
-
if (visited[key] === VISIT_DONE) return;
|
309
|
-
|
310
|
-
cycle.push(key);
|
311
|
-
if (visited[key] === VISIT_IN_PROGRESS) {
|
312
|
-
cycle.splice(0, cycle.indexOf(key));
|
313
|
-
throw new Error("Cyclic dependency: " + cycle.join(" -> "));
|
314
|
-
}
|
315
|
-
visited[key] = VISIT_IN_PROGRESS;
|
316
|
-
|
317
|
-
if (isString(value)) {
|
318
|
-
plan.push(key, [ function() { return $injector.get(value); }], NO_DEPENDENCIES);
|
319
|
-
} else {
|
320
|
-
var params = $injector.annotate(value);
|
321
|
-
forEach(params, function (param) {
|
322
|
-
if (param !== key && invocables.hasOwnProperty(param)) visit(invocables[param], param);
|
323
|
-
});
|
324
|
-
plan.push(key, value, params);
|
325
|
-
}
|
326
|
-
|
327
|
-
cycle.pop();
|
328
|
-
visited[key] = VISIT_DONE;
|
329
|
-
}
|
330
|
-
forEach(invocables, visit);
|
331
|
-
invocables = cycle = visited = null; // plan is all that's required
|
332
|
-
|
333
|
-
function isResolve(value) {
|
334
|
-
return isObject(value) && value.then && value.$$promises;
|
335
|
-
}
|
336
|
-
|
337
|
-
return function (locals, parent, self) {
|
338
|
-
if (isResolve(locals) && self === undefined) {
|
339
|
-
self = parent; parent = locals; locals = null;
|
340
|
-
}
|
341
|
-
if (!locals) locals = NO_LOCALS;
|
342
|
-
else if (!isObject(locals)) {
|
343
|
-
throw new Error("'locals' must be an object");
|
344
|
-
}
|
345
|
-
if (!parent) parent = NO_PARENT;
|
346
|
-
else if (!isResolve(parent)) {
|
347
|
-
throw new Error("'parent' must be a promise returned by $resolve.resolve()");
|
348
|
-
}
|
349
|
-
|
350
|
-
// To complete the overall resolution, we have to wait for the parent
|
351
|
-
// promise and for the promise for each invokable in our plan.
|
352
|
-
var resolution = $q.defer(),
|
353
|
-
result = resolution.promise,
|
354
|
-
promises = result.$$promises = {},
|
355
|
-
values = extend({}, locals),
|
356
|
-
wait = 1 + plan.length/3,
|
357
|
-
merged = false;
|
358
|
-
|
359
|
-
function done() {
|
360
|
-
// Merge parent values we haven't got yet and publish our own $$values
|
361
|
-
if (!--wait) {
|
362
|
-
if (!merged) merge(values, parent.$$values);
|
363
|
-
result.$$values = values;
|
364
|
-
result.$$promises = true; // keep for isResolve()
|
365
|
-
resolution.resolve(values);
|
366
|
-
}
|
367
|
-
}
|
368
|
-
|
369
|
-
function fail(reason) {
|
370
|
-
result.$$failure = reason;
|
371
|
-
resolution.reject(reason);
|
372
|
-
}
|
373
|
-
|
374
|
-
// Short-circuit if parent has already failed
|
375
|
-
if (isDefined(parent.$$failure)) {
|
376
|
-
fail(parent.$$failure);
|
377
|
-
return result;
|
378
|
-
}
|
379
|
-
|
380
|
-
// Merge parent values if the parent has already resolved, or merge
|
381
|
-
// parent promises and wait if the parent resolve is still in progress.
|
382
|
-
if (parent.$$values) {
|
383
|
-
merged = merge(values, parent.$$values);
|
384
|
-
done();
|
385
|
-
} else {
|
386
|
-
extend(promises, parent.$$promises);
|
387
|
-
parent.then(done, fail);
|
388
|
-
}
|
389
|
-
|
390
|
-
// Process each invocable in the plan, but ignore any where a local of the same name exists.
|
391
|
-
for (var i=0, ii=plan.length; i<ii; i+=3) {
|
392
|
-
if (locals.hasOwnProperty(plan[i])) done();
|
393
|
-
else invoke(plan[i], plan[i+1], plan[i+2]);
|
394
|
-
}
|
395
|
-
|
396
|
-
function invoke(key, invocable, params) {
|
397
|
-
// Create a deferred for this invocation. Failures will propagate to the resolution as well.
|
398
|
-
var invocation = $q.defer(), waitParams = 0;
|
399
|
-
function onfailure(reason) {
|
400
|
-
invocation.reject(reason);
|
401
|
-
fail(reason);
|
402
|
-
}
|
403
|
-
// Wait for any parameter that we have a promise for (either from parent or from this
|
404
|
-
// resolve; in that case study() will have made sure it's ordered before us in the plan).
|
405
|
-
forEach(params, function (dep) {
|
406
|
-
if (promises.hasOwnProperty(dep) && !locals.hasOwnProperty(dep)) {
|
407
|
-
waitParams++;
|
408
|
-
promises[dep].then(function (result) {
|
409
|
-
values[dep] = result;
|
410
|
-
if (!(--waitParams)) proceed();
|
411
|
-
}, onfailure);
|
412
|
-
}
|
413
|
-
});
|
414
|
-
if (!waitParams) proceed();
|
415
|
-
function proceed() {
|
416
|
-
if (isDefined(result.$$failure)) return;
|
417
|
-
try {
|
418
|
-
invocation.resolve($injector.invoke(invocable, self, values));
|
419
|
-
invocation.promise.then(function (result) {
|
420
|
-
values[key] = result;
|
421
|
-
done();
|
422
|
-
}, onfailure);
|
423
|
-
} catch (e) {
|
424
|
-
onfailure(e);
|
425
|
-
}
|
426
|
-
}
|
427
|
-
// Publish promise synchronously; invocations further down in the plan may depend on it.
|
428
|
-
promises[key] = invocation.promise;
|
429
|
-
}
|
430
|
-
|
431
|
-
return result;
|
432
|
-
};
|
433
|
-
};
|
434
|
-
|
435
|
-
/**
|
436
|
-
* @ngdoc function
|
437
|
-
* @name ui.router.util.$resolve#resolve
|
438
|
-
* @methodOf ui.router.util.$resolve
|
439
|
-
*
|
440
|
-
* @description
|
441
|
-
* Resolves a set of invocables. An invocable is a function to be invoked via
|
442
|
-
* `$injector.invoke()`, and can have an arbitrary number of dependencies.
|
443
|
-
* An invocable can either return a value directly,
|
444
|
-
* or a `$q` promise. If a promise is returned it will be resolved and the
|
445
|
-
* resulting value will be used instead. Dependencies of invocables are resolved
|
446
|
-
* (in this order of precedence)
|
447
|
-
*
|
448
|
-
* - from the specified `locals`
|
449
|
-
* - from another invocable that is part of this `$resolve` call
|
450
|
-
* - from an invocable that is inherited from a `parent` call to `$resolve`
|
451
|
-
* (or recursively
|
452
|
-
* - from any ancestor `$resolve` of that parent).
|
453
|
-
*
|
454
|
-
* The return value of `$resolve` is a promise for an object that contains
|
455
|
-
* (in this order of precedence)
|
456
|
-
*
|
457
|
-
* - any `locals` (if specified)
|
458
|
-
* - the resolved return values of all injectables
|
459
|
-
* - any values inherited from a `parent` call to `$resolve` (if specified)
|
460
|
-
*
|
461
|
-
* The promise will resolve after the `parent` promise (if any) and all promises
|
462
|
-
* returned by injectables have been resolved. If any invocable
|
463
|
-
* (or `$injector.invoke`) throws an exception, or if a promise returned by an
|
464
|
-
* invocable is rejected, the `$resolve` promise is immediately rejected with the
|
465
|
-
* same error. A rejection of a `parent` promise (if specified) will likewise be
|
466
|
-
* propagated immediately. Once the `$resolve` promise has been rejected, no
|
467
|
-
* further invocables will be called.
|
468
|
-
*
|
469
|
-
* Cyclic dependencies between invocables are not permitted and will caues `$resolve`
|
470
|
-
* to throw an error. As a special case, an injectable can depend on a parameter
|
471
|
-
* with the same name as the injectable, which will be fulfilled from the `parent`
|
472
|
-
* injectable of the same name. This allows inherited values to be decorated.
|
473
|
-
* Note that in this case any other injectable in the same `$resolve` with the same
|
474
|
-
* dependency would see the decorated value, not the inherited value.
|
475
|
-
*
|
476
|
-
* Note that missing dependencies -- unlike cyclic dependencies -- will cause an
|
477
|
-
* (asynchronous) rejection of the `$resolve` promise rather than a (synchronous)
|
478
|
-
* exception.
|
479
|
-
*
|
480
|
-
* Invocables are invoked eagerly as soon as all dependencies are available.
|
481
|
-
* This is true even for dependencies inherited from a `parent` call to `$resolve`.
|
482
|
-
*
|
483
|
-
* As a special case, an invocable can be a string, in which case it is taken to
|
484
|
-
* be a service name to be passed to `$injector.get()`. This is supported primarily
|
485
|
-
* for backwards-compatibility with the `resolve` property of `$routeProvider`
|
486
|
-
* routes.
|
487
|
-
*
|
488
|
-
* @param {object} invocables functions to invoke or
|
489
|
-
* `$injector` services to fetch.
|
490
|
-
* @param {object} locals values to make available to the injectables
|
491
|
-
* @param {object} parent a promise returned by another call to `$resolve`.
|
492
|
-
* @param {object} self the `this` for the invoked methods
|
493
|
-
* @return {object} Promise for an object that contains the resolved return value
|
494
|
-
* of all invocables, as well as any inherited and local values.
|
495
|
-
*/
|
496
|
-
this.resolve = function (invocables, locals, parent, self) {
|
497
|
-
return this.study(invocables)(locals, parent, self);
|
498
|
-
};
|
499
|
-
}
|
500
|
-
|
501
|
-
angular.module('ui.router.util').service('$resolve', $Resolve);
|
502
|
-
|
503
|
-
|
504
|
-
/**
|
505
|
-
* @ngdoc object
|
506
|
-
* @name ui.router.util.$templateFactory
|
507
|
-
*
|
508
|
-
* @requires $http
|
509
|
-
* @requires $templateCache
|
510
|
-
* @requires $injector
|
511
|
-
*
|
512
|
-
* @description
|
513
|
-
* Service. Manages loading of templates.
|
514
|
-
*/
|
515
|
-
$TemplateFactory.$inject = ['$http', '$templateCache', '$injector'];
|
516
|
-
function $TemplateFactory( $http, $templateCache, $injector) {
|
517
|
-
|
518
|
-
/**
|
519
|
-
* @ngdoc function
|
520
|
-
* @name ui.router.util.$templateFactory#fromConfig
|
521
|
-
* @methodOf ui.router.util.$templateFactory
|
522
|
-
*
|
523
|
-
* @description
|
524
|
-
* Creates a template from a configuration object.
|
525
|
-
*
|
526
|
-
* @param {object} config Configuration object for which to load a template.
|
527
|
-
* The following properties are search in the specified order, and the first one
|
528
|
-
* that is defined is used to create the template:
|
529
|
-
*
|
530
|
-
* @param {string|object} config.template html string template or function to
|
531
|
-
* load via {@link ui.router.util.$templateFactory#fromString fromString}.
|
532
|
-
* @param {string|object} config.templateUrl url to load or a function returning
|
533
|
-
* the url to load via {@link ui.router.util.$templateFactory#fromUrl fromUrl}.
|
534
|
-
* @param {Function} config.templateProvider function to invoke via
|
535
|
-
* {@link ui.router.util.$templateFactory#fromProvider fromProvider}.
|
536
|
-
* @param {object} params Parameters to pass to the template function.
|
537
|
-
* @param {object} locals Locals to pass to `invoke` if the template is loaded
|
538
|
-
* via a `templateProvider`. Defaults to `{ params: params }`.
|
539
|
-
*
|
540
|
-
* @return {string|object} The template html as a string, or a promise for
|
541
|
-
* that string,or `null` if no template is configured.
|
542
|
-
*/
|
543
|
-
this.fromConfig = function (config, params, locals) {
|
544
|
-
return (
|
545
|
-
isDefined(config.template) ? this.fromString(config.template, params) :
|
546
|
-
isDefined(config.templateUrl) ? this.fromUrl(config.templateUrl, params) :
|
547
|
-
isDefined(config.templateProvider) ? this.fromProvider(config.templateProvider, params, locals) :
|
548
|
-
null
|
549
|
-
);
|
550
|
-
};
|
551
|
-
|
552
|
-
/**
|
553
|
-
* @ngdoc function
|
554
|
-
* @name ui.router.util.$templateFactory#fromString
|
555
|
-
* @methodOf ui.router.util.$templateFactory
|
556
|
-
*
|
557
|
-
* @description
|
558
|
-
* Creates a template from a string or a function returning a string.
|
559
|
-
*
|
560
|
-
* @param {string|object} template html template as a string or function that
|
561
|
-
* returns an html template as a string.
|
562
|
-
* @param {object} params Parameters to pass to the template function.
|
563
|
-
*
|
564
|
-
* @return {string|object} The template html as a string, or a promise for that
|
565
|
-
* string.
|
566
|
-
*/
|
567
|
-
this.fromString = function (template, params) {
|
568
|
-
return isFunction(template) ? template(params) : template;
|
569
|
-
};
|
570
|
-
|
571
|
-
/**
|
572
|
-
* @ngdoc function
|
573
|
-
* @name ui.router.util.$templateFactory#fromUrl
|
574
|
-
* @methodOf ui.router.util.$templateFactory
|
575
|
-
*
|
576
|
-
* @description
|
577
|
-
* Loads a template from the a URL via `$http` and `$templateCache`.
|
578
|
-
*
|
579
|
-
* @param {string|Function} url url of the template to load, or a function
|
580
|
-
* that returns a url.
|
581
|
-
* @param {Object} params Parameters to pass to the url function.
|
582
|
-
* @return {string|Promise.<string>} The template html as a string, or a promise
|
583
|
-
* for that string.
|
584
|
-
*/
|
585
|
-
this.fromUrl = function (url, params) {
|
586
|
-
if (isFunction(url)) url = url(params);
|
587
|
-
if (url == null) return null;
|
588
|
-
else return $http
|
589
|
-
.get(url, { cache: $templateCache })
|
590
|
-
.then(function(response) { return response.data; });
|
591
|
-
};
|
592
|
-
|
593
|
-
/**
|
594
|
-
* @ngdoc function
|
595
|
-
* @name ui.router.util.$templateFactory#fromUrl
|
596
|
-
* @methodOf ui.router.util.$templateFactory
|
597
|
-
*
|
598
|
-
* @description
|
599
|
-
* Creates a template by invoking an injectable provider function.
|
600
|
-
*
|
601
|
-
* @param {Function} provider Function to invoke via `$injector.invoke`
|
602
|
-
* @param {Object} params Parameters for the template.
|
603
|
-
* @param {Object} locals Locals to pass to `invoke`. Defaults to
|
604
|
-
* `{ params: params }`.
|
605
|
-
* @return {string|Promise.<string>} The template html as a string, or a promise
|
606
|
-
* for that string.
|
607
|
-
*/
|
608
|
-
this.fromProvider = function (provider, params, locals) {
|
609
|
-
return $injector.invoke(provider, null, locals || { params: params });
|
610
|
-
};
|
611
|
-
}
|
612
|
-
|
613
|
-
angular.module('ui.router.util').service('$templateFactory', $TemplateFactory);
|
614
|
-
|
615
|
-
/**
|
616
|
-
* @ngdoc object
|
617
|
-
* @name ui.router.util.type:UrlMatcher
|
618
|
-
*
|
619
|
-
* @description
|
620
|
-
* Matches URLs against patterns and extracts named parameters from the path or the search
|
621
|
-
* part of the URL. A URL pattern consists of a path pattern, optionally followed by '?' and a list
|
622
|
-
* of search parameters. Multiple search parameter names are separated by '&'. Search parameters
|
623
|
-
* do not influence whether or not a URL is matched, but their values are passed through into
|
624
|
-
* the matched parameters returned by {@link ui.router.util.type:UrlMatcher#methods_exec exec}.
|
625
|
-
*
|
626
|
-
* Path parameter placeholders can be specified using simple colon/catch-all syntax or curly brace
|
627
|
-
* syntax, which optionally allows a regular expression for the parameter to be specified:
|
628
|
-
*
|
629
|
-
* * `':'` name - colon placeholder
|
630
|
-
* * `'*'` name - catch-all placeholder
|
631
|
-
* * `'{' name '}'` - curly placeholder
|
632
|
-
* * `'{' name ':' regexp '}'` - curly placeholder with regexp. Should the regexp itself contain
|
633
|
-
* curly braces, they must be in matched pairs or escaped with a backslash.
|
634
|
-
*
|
635
|
-
* Parameter names may contain only word characters (latin letters, digits, and underscore) and
|
636
|
-
* must be unique within the pattern (across both path and search parameters). For colon
|
637
|
-
* placeholders or curly placeholders without an explicit regexp, a path parameter matches any
|
638
|
-
* number of characters other than '/'. For catch-all placeholders the path parameter matches
|
639
|
-
* any number of characters.
|
640
|
-
*
|
641
|
-
* Examples:
|
642
|
-
*
|
643
|
-
* * `'/hello/'` - Matches only if the path is exactly '/hello/'. There is no special treatment for
|
644
|
-
* trailing slashes, and patterns have to match the entire path, not just a prefix.
|
645
|
-
* * `'/user/:id'` - Matches '/user/bob' or '/user/1234!!!' or even '/user/' but not '/user' or
|
646
|
-
* '/user/bob/details'. The second path segment will be captured as the parameter 'id'.
|
647
|
-
* * `'/user/{id}'` - Same as the previous example, but using curly brace syntax.
|
648
|
-
* * `'/user/{id:[^/]*}'` - Same as the previous example.
|
649
|
-
* * `'/user/{id:[0-9a-fA-F]{1,8}}'` - Similar to the previous example, but only matches if the id
|
650
|
-
* parameter consists of 1 to 8 hex digits.
|
651
|
-
* * `'/files/{path:.*}'` - Matches any URL starting with '/files/' and captures the rest of the
|
652
|
-
* path into the parameter 'path'.
|
653
|
-
* * `'/files/*path'` - ditto.
|
654
|
-
*
|
655
|
-
* @param {string} pattern the pattern to compile into a matcher.
|
656
|
-
*
|
657
|
-
* @property {string} prefix A static prefix of this pattern. The matcher guarantees that any
|
658
|
-
* URL matching this matcher (i.e. any string for which {@link ui.router.util.type:UrlMatcher#methods_exec exec()} returns
|
659
|
-
* non-null) will start with this prefix.
|
660
|
-
*
|
661
|
-
* @property {string} source The pattern that was passed into the contructor
|
662
|
-
*
|
663
|
-
* @property {string} sourcePath The path portion of the source property
|
664
|
-
*
|
665
|
-
* @property {string} sourceSearch The search portion of the source property
|
666
|
-
*
|
667
|
-
* @property {string} regex The constructed regex that will be used to match against the url when
|
668
|
-
* it is time to determine which url will match.
|
669
|
-
*
|
670
|
-
* @returns {Object} New UrlMatcher object
|
671
|
-
*/
|
672
|
-
function UrlMatcher(pattern) {
|
673
|
-
|
674
|
-
// Find all placeholders and create a compiled pattern, using either classic or curly syntax:
|
675
|
-
// '*' name
|
676
|
-
// ':' name
|
677
|
-
// '{' name '}'
|
678
|
-
// '{' name ':' regexp '}'
|
679
|
-
// The regular expression is somewhat complicated due to the need to allow curly braces
|
680
|
-
// inside the regular expression. The placeholder regexp breaks down as follows:
|
681
|
-
// ([:*])(\w+) classic placeholder ($1 / $2)
|
682
|
-
// \{(\w+)(?:\:( ... ))?\} curly brace placeholder ($3) with optional regexp ... ($4)
|
683
|
-
// (?: ... | ... | ... )+ the regexp consists of any number of atoms, an atom being either
|
684
|
-
// [^{}\\]+ - anything other than curly braces or backslash
|
685
|
-
// \\. - a backslash escape
|
686
|
-
// \{(?:[^{}\\]+|\\.)*\} - a matched set of curly braces containing other atoms
|
687
|
-
var placeholder = /([:*])(\w+)|\{(\w+)(?:\:((?:[^{}\\]+|\\.|\{(?:[^{}\\]+|\\.)*\})+))?\}/g,
|
688
|
-
names = {}, compiled = '^', last = 0, m,
|
689
|
-
segments = this.segments = [],
|
690
|
-
params = this.params = [];
|
691
|
-
|
692
|
-
function addParameter(id) {
|
693
|
-
if (!/^\w+(-+\w+)*$/.test(id)) throw new Error("Invalid parameter name '" + id + "' in pattern '" + pattern + "'");
|
694
|
-
if (names[id]) throw new Error("Duplicate parameter name '" + id + "' in pattern '" + pattern + "'");
|
695
|
-
names[id] = true;
|
696
|
-
params.push(id);
|
697
|
-
}
|
698
|
-
|
699
|
-
function quoteRegExp(string) {
|
700
|
-
return string.replace(/[\\\[\]\^$*+?.()|{}]/g, "\\$&");
|
701
|
-
}
|
702
|
-
|
703
|
-
this.source = pattern;
|
704
|
-
|
705
|
-
// Split into static segments separated by path parameter placeholders.
|
706
|
-
// The number of segments is always 1 more than the number of parameters.
|
707
|
-
var id, regexp, segment;
|
708
|
-
while ((m = placeholder.exec(pattern))) {
|
709
|
-
id = m[2] || m[3]; // IE[78] returns '' for unmatched groups instead of null
|
710
|
-
regexp = m[4] || (m[1] == '*' ? '.*' : '[^/]*');
|
711
|
-
segment = pattern.substring(last, m.index);
|
712
|
-
if (segment.indexOf('?') >= 0) break; // we're into the search part
|
713
|
-
compiled += quoteRegExp(segment) + '(' + regexp + ')';
|
714
|
-
addParameter(id);
|
715
|
-
segments.push(segment);
|
716
|
-
last = placeholder.lastIndex;
|
717
|
-
}
|
718
|
-
segment = pattern.substring(last);
|
719
|
-
|
720
|
-
// Find any search parameter names and remove them from the last segment
|
721
|
-
var i = segment.indexOf('?');
|
722
|
-
if (i >= 0) {
|
723
|
-
var search = this.sourceSearch = segment.substring(i);
|
724
|
-
segment = segment.substring(0, i);
|
725
|
-
this.sourcePath = pattern.substring(0, last+i);
|
726
|
-
|
727
|
-
// Allow parameters to be separated by '?' as well as '&' to make concat() easier
|
728
|
-
forEach(search.substring(1).split(/[&?]/), addParameter);
|
729
|
-
} else {
|
730
|
-
this.sourcePath = pattern;
|
731
|
-
this.sourceSearch = '';
|
732
|
-
}
|
733
|
-
|
734
|
-
compiled += quoteRegExp(segment) + '$';
|
735
|
-
segments.push(segment);
|
736
|
-
this.regexp = new RegExp(compiled);
|
737
|
-
this.prefix = segments[0];
|
738
|
-
}
|
739
|
-
|
740
|
-
/**
|
741
|
-
* @ngdoc function
|
742
|
-
* @name ui.router.util.type:UrlMatcher#concat
|
743
|
-
* @methodOf ui.router.util.type:UrlMatcher
|
744
|
-
*
|
745
|
-
* @description
|
746
|
-
* Returns a new matcher for a pattern constructed by appending the path part and adding the
|
747
|
-
* search parameters of the specified pattern to this pattern. The current pattern is not
|
748
|
-
* modified. This can be understood as creating a pattern for URLs that are relative to (or
|
749
|
-
* suffixes of) the current pattern.
|
750
|
-
*
|
751
|
-
* @example
|
752
|
-
* The following two matchers are equivalent:
|
753
|
-
* ```
|
754
|
-
* new UrlMatcher('/user/{id}?q').concat('/details?date');
|
755
|
-
* new UrlMatcher('/user/{id}/details?q&date');
|
756
|
-
* ```
|
757
|
-
*
|
758
|
-
* @param {string} pattern The pattern to append.
|
759
|
-
* @returns {ui.router.util.type:UrlMatcher} A matcher for the concatenated pattern.
|
760
|
-
*/
|
761
|
-
UrlMatcher.prototype.concat = function (pattern) {
|
762
|
-
// Because order of search parameters is irrelevant, we can add our own search
|
763
|
-
// parameters to the end of the new pattern. Parse the new pattern by itself
|
764
|
-
// and then join the bits together, but it's much easier to do this on a string level.
|
765
|
-
return new UrlMatcher(this.sourcePath + pattern + this.sourceSearch);
|
766
|
-
};
|
767
|
-
|
768
|
-
UrlMatcher.prototype.toString = function () {
|
769
|
-
return this.source;
|
770
|
-
};
|
771
|
-
|
772
|
-
/**
|
773
|
-
* @ngdoc function
|
774
|
-
* @name ui.router.util.type:UrlMatcher#exec
|
775
|
-
* @methodOf ui.router.util.type:UrlMatcher
|
776
|
-
*
|
777
|
-
* @description
|
778
|
-
* Tests the specified path against this matcher, and returns an object containing the captured
|
779
|
-
* parameter values, or null if the path does not match. The returned object contains the values
|
780
|
-
* of any search parameters that are mentioned in the pattern, but their value may be null if
|
781
|
-
* they are not present in `searchParams`. This means that search parameters are always treated
|
782
|
-
* as optional.
|
783
|
-
*
|
784
|
-
* @example
|
785
|
-
* ```
|
786
|
-
* new UrlMatcher('/user/{id}?q&r').exec('/user/bob', { x:'1', q:'hello' });
|
787
|
-
* // returns { id:'bob', q:'hello', r:null }
|
788
|
-
* ```
|
789
|
-
*
|
790
|
-
* @param {string} path The URL path to match, e.g. `$location.path()`.
|
791
|
-
* @param {Object} searchParams URL search parameters, e.g. `$location.search()`.
|
792
|
-
* @returns {Object} The captured parameter values.
|
793
|
-
*/
|
794
|
-
UrlMatcher.prototype.exec = function (path, searchParams) {
|
795
|
-
var m = this.regexp.exec(path);
|
796
|
-
if (!m) return null;
|
797
|
-
|
798
|
-
var params = this.params, nTotal = params.length,
|
799
|
-
nPath = this.segments.length-1,
|
800
|
-
values = {}, i;
|
801
|
-
|
802
|
-
if (nPath !== m.length - 1) throw new Error("Unbalanced capture group in route '" + this.source + "'");
|
803
|
-
|
804
|
-
for (i=0; i<nPath; i++) values[params[i]] = m[i+1];
|
805
|
-
for (/**/; i<nTotal; i++) values[params[i]] = searchParams[params[i]];
|
806
|
-
|
807
|
-
return values;
|
808
|
-
};
|
809
|
-
|
810
|
-
/**
|
811
|
-
* @ngdoc function
|
812
|
-
* @name ui.router.util.type:UrlMatcher#parameters
|
813
|
-
* @methodOf ui.router.util.type:UrlMatcher
|
814
|
-
*
|
815
|
-
* @description
|
816
|
-
* Returns the names of all path and search parameters of this pattern in an unspecified order.
|
817
|
-
*
|
818
|
-
* @returns {Array.<string>} An array of parameter names. Must be treated as read-only. If the
|
819
|
-
* pattern has no parameters, an empty array is returned.
|
820
|
-
*/
|
821
|
-
UrlMatcher.prototype.parameters = function () {
|
822
|
-
return this.params;
|
823
|
-
};
|
824
|
-
|
825
|
-
/**
|
826
|
-
* @ngdoc function
|
827
|
-
* @name ui.router.util.type:UrlMatcher#format
|
828
|
-
* @methodOf ui.router.util.type:UrlMatcher
|
829
|
-
*
|
830
|
-
* @description
|
831
|
-
* Creates a URL that matches this pattern by substituting the specified values
|
832
|
-
* for the path and search parameters. Null values for path parameters are
|
833
|
-
* treated as empty strings.
|
834
|
-
*
|
835
|
-
* @example
|
836
|
-
* ```
|
837
|
-
* new UrlMatcher('/user/{id}?q').format({ id:'bob', q:'yes' });
|
838
|
-
* // returns '/user/bob?q=yes'
|
839
|
-
* ```
|
840
|
-
*
|
841
|
-
* @param {Object} values the values to substitute for the parameters in this pattern.
|
842
|
-
* @returns {string} the formatted URL (path and optionally search part).
|
843
|
-
*/
|
844
|
-
UrlMatcher.prototype.format = function (values) {
|
845
|
-
var segments = this.segments, params = this.params;
|
846
|
-
if (!values) return segments.join('');
|
847
|
-
|
848
|
-
var nPath = segments.length-1, nTotal = params.length,
|
849
|
-
result = segments[0], i, search, value;
|
850
|
-
|
851
|
-
for (i=0; i<nPath; i++) {
|
852
|
-
value = values[params[i]];
|
853
|
-
// TODO: Maybe we should throw on null here? It's not really good style to use '' and null interchangeabley
|
854
|
-
if (value != null) result += encodeURIComponent(value);
|
855
|
-
result += segments[i+1];
|
856
|
-
}
|
857
|
-
for (/**/; i<nTotal; i++) {
|
858
|
-
value = values[params[i]];
|
859
|
-
if (value != null) {
|
860
|
-
result += (search ? '&' : '?') + params[i] + '=' + encodeURIComponent(value);
|
861
|
-
search = true;
|
862
|
-
}
|
863
|
-
}
|
864
|
-
|
865
|
-
return result;
|
866
|
-
};
|
867
|
-
|
868
|
-
|
869
|
-
|
870
|
-
/**
|
871
|
-
* @ngdoc object
|
872
|
-
* @name ui.router.util.$urlMatcherFactory
|
873
|
-
*
|
874
|
-
* @description
|
875
|
-
* Factory for {@link ui.router.util.type:UrlMatcher} instances. The factory is also available to providers
|
876
|
-
* under the name `$urlMatcherFactoryProvider`.
|
877
|
-
*/
|
878
|
-
function $UrlMatcherFactory() {
|
879
|
-
|
880
|
-
/**
|
881
|
-
* @ngdoc function
|
882
|
-
* @name ui.router.util.$urlMatcherFactory#compile
|
883
|
-
* @methodOf ui.router.util.$urlMatcherFactory
|
884
|
-
*
|
885
|
-
* @description
|
886
|
-
* Creates a {@link ui.router.util.type:UrlMatcher} for the specified pattern.
|
887
|
-
*
|
888
|
-
* @param {string} pattern The URL pattern.
|
889
|
-
* @returns {ui.router.util.type:UrlMatcher} The UrlMatcher.
|
890
|
-
*/
|
891
|
-
this.compile = function (pattern) {
|
892
|
-
return new UrlMatcher(pattern);
|
893
|
-
};
|
894
|
-
|
895
|
-
/**
|
896
|
-
* @ngdoc function
|
897
|
-
* @name ui.router.util.$urlMatcherFactory#isMatcher
|
898
|
-
* @methodOf ui.router.util.$urlMatcherFactory
|
899
|
-
*
|
900
|
-
* @description
|
901
|
-
* Returns true if the specified object is a UrlMatcher, or false otherwise.
|
902
|
-
*
|
903
|
-
* @param {Object} object The object to perform the type check against.
|
904
|
-
* @returns {Boolean} Returns `true` if the object has the following functions: `exec`, `format`, and `concat`.
|
905
|
-
*/
|
906
|
-
this.isMatcher = function (o) {
|
907
|
-
return isObject(o) && isFunction(o.exec) && isFunction(o.format) && isFunction(o.concat);
|
908
|
-
};
|
909
|
-
|
910
|
-
/* No need to document $get, since it returns this */
|
911
|
-
this.$get = function () {
|
912
|
-
return this;
|
913
|
-
};
|
914
|
-
}
|
915
|
-
|
916
|
-
// Register as a provider so it's available to other providers
|
917
|
-
angular.module('ui.router.util').provider('$urlMatcherFactory', $UrlMatcherFactory);
|
918
|
-
|
919
|
-
/**
|
920
|
-
* @ngdoc object
|
921
|
-
* @name ui.router.router.$urlRouterProvider
|
922
|
-
*
|
923
|
-
* @requires ui.router.util.$urlMatcherFactoryProvider
|
924
|
-
*
|
925
|
-
* @description
|
926
|
-
* `$urlRouterProvider` has the responsibility of watching `$location`.
|
927
|
-
* When `$location` changes it runs through a list of rules one by one until a
|
928
|
-
* match is found. `$urlRouterProvider` is used behind the scenes anytime you specify
|
929
|
-
* a url in a state configuration. All urls are compiled into a UrlMatcher object.
|
930
|
-
*
|
931
|
-
* There are several methods on `$urlRouterProvider` that make it useful to use directly
|
932
|
-
* in your module config.
|
933
|
-
*/
|
934
|
-
$UrlRouterProvider.$inject = ['$urlMatcherFactoryProvider'];
|
935
|
-
function $UrlRouterProvider( $urlMatcherFactory) {
|
936
|
-
var rules = [],
|
937
|
-
otherwise = null;
|
938
|
-
|
939
|
-
// Returns a string that is a prefix of all strings matching the RegExp
|
940
|
-
function regExpPrefix(re) {
|
941
|
-
var prefix = /^\^((?:\\[^a-zA-Z0-9]|[^\\\[\]\^$*+?.()|{}]+)*)/.exec(re.source);
|
942
|
-
return (prefix != null) ? prefix[1].replace(/\\(.)/g, "$1") : '';
|
943
|
-
}
|
944
|
-
|
945
|
-
// Interpolates matched values into a String.replace()-style pattern
|
946
|
-
function interpolate(pattern, match) {
|
947
|
-
return pattern.replace(/\$(\$|\d{1,2})/, function (m, what) {
|
948
|
-
return match[what === '$' ? 0 : Number(what)];
|
949
|
-
});
|
950
|
-
}
|
951
|
-
|
952
|
-
/**
|
953
|
-
* @ngdoc function
|
954
|
-
* @name ui.router.router.$urlRouterProvider#rule
|
955
|
-
* @methodOf ui.router.router.$urlRouterProvider
|
956
|
-
*
|
957
|
-
* @description
|
958
|
-
* Defines rules that are used by `$urlRouterProvider to find matches for
|
959
|
-
* specific URLs.
|
960
|
-
*
|
961
|
-
* @example
|
962
|
-
* <pre>
|
963
|
-
* var app = angular.module('app', ['ui.router.router']);
|
964
|
-
*
|
965
|
-
* app.config(function ($urlRouterProvider) {
|
966
|
-
* // Here's an example of how you might allow case insensitive urls
|
967
|
-
* $urlRouterProvider.rule(function ($injector, $location) {
|
968
|
-
* var path = $location.path(),
|
969
|
-
* normalized = path.toLowerCase();
|
970
|
-
*
|
971
|
-
* if (path !== normalized) {
|
972
|
-
* return normalized;
|
973
|
-
* }
|
974
|
-
* });
|
975
|
-
* });
|
976
|
-
* </pre>
|
977
|
-
*
|
978
|
-
* @param {object} rule Handler function that takes `$injector` and `$location`
|
979
|
-
* services as arguments. You can use them to return a valid path as a string.
|
980
|
-
*
|
981
|
-
* @return {object} $urlRouterProvider - $urlRouterProvider instance
|
982
|
-
*/
|
983
|
-
this.rule =
|
984
|
-
function (rule) {
|
985
|
-
if (!isFunction(rule)) throw new Error("'rule' must be a function");
|
986
|
-
rules.push(rule);
|
987
|
-
return this;
|
988
|
-
};
|
989
|
-
|
990
|
-
/**
|
991
|
-
* @ngdoc object
|
992
|
-
* @name ui.router.router.$urlRouterProvider#otherwise
|
993
|
-
* @methodOf ui.router.router.$urlRouterProvider
|
994
|
-
*
|
995
|
-
* @description
|
996
|
-
* Defines a path that is used when an invalied route is requested.
|
997
|
-
*
|
998
|
-
* @example
|
999
|
-
* <pre>
|
1000
|
-
* var app = angular.module('app', ['ui.router.router']);
|
1001
|
-
*
|
1002
|
-
* app.config(function ($urlRouterProvider) {
|
1003
|
-
* // if the path doesn't match any of the urls you configured
|
1004
|
-
* // otherwise will take care of routing the user to the
|
1005
|
-
* // specified url
|
1006
|
-
* $urlRouterProvider.otherwise('/index');
|
1007
|
-
*
|
1008
|
-
* // Example of using function rule as param
|
1009
|
-
* $urlRouterProvider.otherwise(function ($injector, $location) {
|
1010
|
-
* ...
|
1011
|
-
* });
|
1012
|
-
* });
|
1013
|
-
* </pre>
|
1014
|
-
*
|
1015
|
-
* @param {string|object} rule The url path you want to redirect to or a function
|
1016
|
-
* rule that returns the url path. The function version is passed two params:
|
1017
|
-
* `$injector` and `$location` services.
|
1018
|
-
*
|
1019
|
-
* @return {object} $urlRouterProvider - $urlRouterProvider instance
|
1020
|
-
*/
|
1021
|
-
this.otherwise =
|
1022
|
-
function (rule) {
|
1023
|
-
if (isString(rule)) {
|
1024
|
-
var redirect = rule;
|
1025
|
-
rule = function () { return redirect; };
|
1026
|
-
}
|
1027
|
-
else if (!isFunction(rule)) throw new Error("'rule' must be a function");
|
1028
|
-
otherwise = rule;
|
1029
|
-
return this;
|
1030
|
-
};
|
1031
|
-
|
1032
|
-
|
1033
|
-
function handleIfMatch($injector, handler, match) {
|
1034
|
-
if (!match) return false;
|
1035
|
-
var result = $injector.invoke(handler, handler, { $match: match });
|
1036
|
-
return isDefined(result) ? result : true;
|
1037
|
-
}
|
1038
|
-
|
1039
|
-
/**
|
1040
|
-
* @ngdoc function
|
1041
|
-
* @name ui.router.router.$urlRouterProvider#when
|
1042
|
-
* @methodOf ui.router.router.$urlRouterProvider
|
1043
|
-
*
|
1044
|
-
* @description
|
1045
|
-
* Registers a handler for a given url matching. if handle is a string, it is
|
1046
|
-
* treated as a redirect, and is interpolated according to the syyntax of match
|
1047
|
-
* (i.e. like String.replace() for RegExp, or like a UrlMatcher pattern otherwise).
|
1048
|
-
*
|
1049
|
-
* If the handler is a function, it is injectable. It gets invoked if `$location`
|
1050
|
-
* matches. You have the option of inject the match object as `$match`.
|
1051
|
-
*
|
1052
|
-
* The handler can return
|
1053
|
-
*
|
1054
|
-
* - **falsy** to indicate that the rule didn't match after all, then `$urlRouter`
|
1055
|
-
* will continue trying to find another one that matches.
|
1056
|
-
* - **string** which is treated as a redirect and passed to `$location.url()`
|
1057
|
-
* - **void** or any **truthy** value tells `$urlRouter` that the url was handled.
|
1058
|
-
*
|
1059
|
-
* @example
|
1060
|
-
* <pre>
|
1061
|
-
* var app = angular.module('app', ['ui.router.router']);
|
1062
|
-
*
|
1063
|
-
* app.config(function ($urlRouterProvider) {
|
1064
|
-
* $urlRouterProvider.when($state.url, function ($match, $stateParams) {
|
1065
|
-
* if ($state.$current.navigable !== state ||
|
1066
|
-
* !equalForKeys($match, $stateParams) {
|
1067
|
-
* $state.transitionTo(state, $match, false);
|
1068
|
-
* }
|
1069
|
-
* });
|
1070
|
-
* });
|
1071
|
-
* </pre>
|
1072
|
-
*
|
1073
|
-
* @param {string|object} what The incoming path that you want to redirect.
|
1074
|
-
* @param {string|object} handler The path you want to redirect your user to.
|
1075
|
-
*/
|
1076
|
-
this.when =
|
1077
|
-
function (what, handler) {
|
1078
|
-
var redirect, handlerIsString = isString(handler);
|
1079
|
-
if (isString(what)) what = $urlMatcherFactory.compile(what);
|
1080
|
-
|
1081
|
-
if (!handlerIsString && !isFunction(handler) && !isArray(handler))
|
1082
|
-
throw new Error("invalid 'handler' in when()");
|
1083
|
-
|
1084
|
-
var strategies = {
|
1085
|
-
matcher: function (what, handler) {
|
1086
|
-
if (handlerIsString) {
|
1087
|
-
redirect = $urlMatcherFactory.compile(handler);
|
1088
|
-
handler = ['$match', function ($match) { return redirect.format($match); }];
|
1089
|
-
}
|
1090
|
-
return extend(function ($injector, $location) {
|
1091
|
-
return handleIfMatch($injector, handler, what.exec($location.path(), $location.search()));
|
1092
|
-
}, {
|
1093
|
-
prefix: isString(what.prefix) ? what.prefix : ''
|
1094
|
-
});
|
1095
|
-
},
|
1096
|
-
regex: function (what, handler) {
|
1097
|
-
if (what.global || what.sticky) throw new Error("when() RegExp must not be global or sticky");
|
1098
|
-
|
1099
|
-
if (handlerIsString) {
|
1100
|
-
redirect = handler;
|
1101
|
-
handler = ['$match', function ($match) { return interpolate(redirect, $match); }];
|
1102
|
-
}
|
1103
|
-
return extend(function ($injector, $location) {
|
1104
|
-
return handleIfMatch($injector, handler, what.exec($location.path()));
|
1105
|
-
}, {
|
1106
|
-
prefix: regExpPrefix(what)
|
1107
|
-
});
|
1108
|
-
}
|
1109
|
-
};
|
1110
|
-
|
1111
|
-
var check = { matcher: $urlMatcherFactory.isMatcher(what), regex: what instanceof RegExp };
|
1112
|
-
|
1113
|
-
for (var n in check) {
|
1114
|
-
if (check[n]) {
|
1115
|
-
return this.rule(strategies[n](what, handler));
|
1116
|
-
}
|
1117
|
-
}
|
1118
|
-
|
1119
|
-
throw new Error("invalid 'what' in when()");
|
1120
|
-
};
|
1121
|
-
|
1122
|
-
/**
|
1123
|
-
* @ngdoc object
|
1124
|
-
* @name ui.router.router.$urlRouter
|
1125
|
-
*
|
1126
|
-
* @requires $location
|
1127
|
-
* @requires $rootScope
|
1128
|
-
* @requires $injector
|
1129
|
-
*
|
1130
|
-
* @description
|
1131
|
-
*
|
1132
|
-
*/
|
1133
|
-
this.$get =
|
1134
|
-
[ '$location', '$rootScope', '$injector',
|
1135
|
-
function ($location, $rootScope, $injector) {
|
1136
|
-
// TODO: Optimize groups of rules with non-empty prefix into some sort of decision tree
|
1137
|
-
function update(evt) {
|
1138
|
-
if (evt && evt.defaultPrevented) return;
|
1139
|
-
function check(rule) {
|
1140
|
-
var handled = rule($injector, $location);
|
1141
|
-
if (handled) {
|
1142
|
-
if (isString(handled)) $location.replace().url(handled);
|
1143
|
-
return true;
|
1144
|
-
}
|
1145
|
-
return false;
|
1146
|
-
}
|
1147
|
-
var n=rules.length, i;
|
1148
|
-
for (i=0; i<n; i++) {
|
1149
|
-
if (check(rules[i])) return;
|
1150
|
-
}
|
1151
|
-
// always check otherwise last to allow dynamic updates to the set of rules
|
1152
|
-
if (otherwise) check(otherwise);
|
1153
|
-
}
|
1154
|
-
|
1155
|
-
$rootScope.$on('$locationChangeSuccess', update);
|
1156
|
-
|
1157
|
-
return {
|
1158
|
-
/**
|
1159
|
-
* @ngdoc function
|
1160
|
-
* @name ui.router.router.$urlRouter#sync
|
1161
|
-
* @methodOf ui.router.router.$urlRouter
|
1162
|
-
*
|
1163
|
-
* @description
|
1164
|
-
* Triggers an update; the same update that happens when the address bar url changes, aka `$locationChangeSuccess`.
|
1165
|
-
* This method is useful when you need to use `preventDefault()` on the `$locationChangeSuccess` event,
|
1166
|
-
* perform some custom logic (route protection, auth, config, redirection, etc) and then finally proceed
|
1167
|
-
* with the transition by calling `$urlRouter.sync()`.
|
1168
|
-
*
|
1169
|
-
* @example
|
1170
|
-
* <pre>
|
1171
|
-
* angular.module('app', ['ui.router']);
|
1172
|
-
* .run(function($rootScope, $urlRouter) {
|
1173
|
-
* $rootScope.$on('$locationChangeSuccess', function(evt) {
|
1174
|
-
* // Halt state change from even starting
|
1175
|
-
* evt.preventDefault();
|
1176
|
-
* // Perform custom logic
|
1177
|
-
* var meetsRequirement = ...
|
1178
|
-
* // Continue with the update and state transition if logic allows
|
1179
|
-
* if (meetsRequirement) $urlRouter.sync();
|
1180
|
-
* });
|
1181
|
-
* });
|
1182
|
-
* </pre>
|
1183
|
-
*/
|
1184
|
-
sync: function () {
|
1185
|
-
update();
|
1186
|
-
}
|
1187
|
-
};
|
1188
|
-
}];
|
1189
|
-
}
|
1190
|
-
|
1191
|
-
angular.module('ui.router.router').provider('$urlRouter', $UrlRouterProvider);
|
1192
|
-
|
1193
|
-
/**
|
1194
|
-
* @ngdoc object
|
1195
|
-
* @name ui.router.state.$stateProvider
|
1196
|
-
*
|
1197
|
-
* @requires ui.router.router.$urlRouterProvider
|
1198
|
-
* @requires ui.router.util.$urlMatcherFactoryProvider
|
1199
|
-
* @requires $locationProvider
|
1200
|
-
*
|
1201
|
-
* @description
|
1202
|
-
* The new `$stateProvider` works similar to Angular's v1 router, but it focuses purely
|
1203
|
-
* on state.
|
1204
|
-
*
|
1205
|
-
* A state corresponds to a "place" in the application in terms of the overall UI and
|
1206
|
-
* navigation. A state describes (via the controller / template / view properties) what
|
1207
|
-
* the UI looks like and does at that place.
|
1208
|
-
*
|
1209
|
-
* States often have things in common, and the primary way of factoring out these
|
1210
|
-
* commonalities in this model is via the state hierarchy, i.e. parent/child states aka
|
1211
|
-
* nested states.
|
1212
|
-
*
|
1213
|
-
* The `$stateProvider` provides interfaces to declare these states for your app.
|
1214
|
-
*/
|
1215
|
-
$StateProvider.$inject = ['$urlRouterProvider', '$urlMatcherFactoryProvider', '$locationProvider'];
|
1216
|
-
function $StateProvider( $urlRouterProvider, $urlMatcherFactory, $locationProvider) {
|
1217
|
-
|
1218
|
-
var root, states = {}, $state, queue = {}, abstractKey = 'abstract';
|
1219
|
-
|
1220
|
-
// Builds state properties from definition passed to registerState()
|
1221
|
-
var stateBuilder = {
|
1222
|
-
|
1223
|
-
// Derive parent state from a hierarchical name only if 'parent' is not explicitly defined.
|
1224
|
-
// state.children = [];
|
1225
|
-
// if (parent) parent.children.push(state);
|
1226
|
-
parent: function(state) {
|
1227
|
-
if (isDefined(state.parent) && state.parent) return findState(state.parent);
|
1228
|
-
// regex matches any valid composite state name
|
1229
|
-
// would match "contact.list" but not "contacts"
|
1230
|
-
var compositeName = /^(.+)\.[^.]+$/.exec(state.name);
|
1231
|
-
return compositeName ? findState(compositeName[1]) : root;
|
1232
|
-
},
|
1233
|
-
|
1234
|
-
// inherit 'data' from parent and override by own values (if any)
|
1235
|
-
data: function(state) {
|
1236
|
-
if (state.parent && state.parent.data) {
|
1237
|
-
state.data = state.self.data = extend({}, state.parent.data, state.data);
|
1238
|
-
}
|
1239
|
-
return state.data;
|
1240
|
-
},
|
1241
|
-
|
1242
|
-
// Build a URLMatcher if necessary, either via a relative or absolute URL
|
1243
|
-
url: function(state) {
|
1244
|
-
var url = state.url;
|
1245
|
-
|
1246
|
-
if (isString(url)) {
|
1247
|
-
if (url.charAt(0) == '^') {
|
1248
|
-
return $urlMatcherFactory.compile(url.substring(1));
|
1249
|
-
}
|
1250
|
-
return (state.parent.navigable || root).url.concat(url);
|
1251
|
-
}
|
1252
|
-
|
1253
|
-
if ($urlMatcherFactory.isMatcher(url) || url == null) {
|
1254
|
-
return url;
|
1255
|
-
}
|
1256
|
-
throw new Error("Invalid url '" + url + "' in state '" + state + "'");
|
1257
|
-
},
|
1258
|
-
|
1259
|
-
// Keep track of the closest ancestor state that has a URL (i.e. is navigable)
|
1260
|
-
navigable: function(state) {
|
1261
|
-
return state.url ? state : (state.parent ? state.parent.navigable : null);
|
1262
|
-
},
|
1263
|
-
|
1264
|
-
// Derive parameters for this state and ensure they're a super-set of parent's parameters
|
1265
|
-
params: function(state) {
|
1266
|
-
if (!state.params) {
|
1267
|
-
return state.url ? state.url.parameters() : state.parent.params;
|
1268
|
-
}
|
1269
|
-
if (!isArray(state.params)) throw new Error("Invalid params in state '" + state + "'");
|
1270
|
-
if (state.url) throw new Error("Both params and url specicified in state '" + state + "'");
|
1271
|
-
return state.params;
|
1272
|
-
},
|
1273
|
-
|
1274
|
-
// If there is no explicit multi-view configuration, make one up so we don't have
|
1275
|
-
// to handle both cases in the view directive later. Note that having an explicit
|
1276
|
-
// 'views' property will mean the default unnamed view properties are ignored. This
|
1277
|
-
// is also a good time to resolve view names to absolute names, so everything is a
|
1278
|
-
// straight lookup at link time.
|
1279
|
-
views: function(state) {
|
1280
|
-
var views = {};
|
1281
|
-
|
1282
|
-
forEach(isDefined(state.views) ? state.views : { '': state }, function (view, name) {
|
1283
|
-
if (name.indexOf('@') < 0) name += '@' + state.parent.name;
|
1284
|
-
views[name] = view;
|
1285
|
-
});
|
1286
|
-
return views;
|
1287
|
-
},
|
1288
|
-
|
1289
|
-
ownParams: function(state) {
|
1290
|
-
if (!state.parent) {
|
1291
|
-
return state.params;
|
1292
|
-
}
|
1293
|
-
var paramNames = {}; forEach(state.params, function (p) { paramNames[p] = true; });
|
1294
|
-
|
1295
|
-
forEach(state.parent.params, function (p) {
|
1296
|
-
if (!paramNames[p]) {
|
1297
|
-
throw new Error("Missing required parameter '" + p + "' in state '" + state.name + "'");
|
1298
|
-
}
|
1299
|
-
paramNames[p] = false;
|
1300
|
-
});
|
1301
|
-
var ownParams = [];
|
1302
|
-
|
1303
|
-
forEach(paramNames, function (own, p) {
|
1304
|
-
if (own) ownParams.push(p);
|
1305
|
-
});
|
1306
|
-
return ownParams;
|
1307
|
-
},
|
1308
|
-
|
1309
|
-
// Keep a full path from the root down to this state as this is needed for state activation.
|
1310
|
-
path: function(state) {
|
1311
|
-
return state.parent ? state.parent.path.concat(state) : []; // exclude root from path
|
1312
|
-
},
|
1313
|
-
|
1314
|
-
// Speed up $state.contains() as it's used a lot
|
1315
|
-
includes: function(state) {
|
1316
|
-
var includes = state.parent ? extend({}, state.parent.includes) : {};
|
1317
|
-
includes[state.name] = true;
|
1318
|
-
return includes;
|
1319
|
-
},
|
1320
|
-
|
1321
|
-
$delegates: {}
|
1322
|
-
};
|
1323
|
-
|
1324
|
-
function isRelative(stateName) {
|
1325
|
-
return stateName.indexOf(".") === 0 || stateName.indexOf("^") === 0;
|
1326
|
-
}
|
1327
|
-
|
1328
|
-
function findState(stateOrName, base) {
|
1329
|
-
var isStr = isString(stateOrName),
|
1330
|
-
name = isStr ? stateOrName : stateOrName.name,
|
1331
|
-
path = isRelative(name);
|
1332
|
-
|
1333
|
-
if (path) {
|
1334
|
-
if (!base) throw new Error("No reference point given for path '" + name + "'");
|
1335
|
-
var rel = name.split("."), i = 0, pathLength = rel.length, current = base;
|
1336
|
-
|
1337
|
-
for (; i < pathLength; i++) {
|
1338
|
-
if (rel[i] === "" && i === 0) {
|
1339
|
-
current = base;
|
1340
|
-
continue;
|
1341
|
-
}
|
1342
|
-
if (rel[i] === "^") {
|
1343
|
-
if (!current.parent) throw new Error("Path '" + name + "' not valid for state '" + base.name + "'");
|
1344
|
-
current = current.parent;
|
1345
|
-
continue;
|
1346
|
-
}
|
1347
|
-
break;
|
1348
|
-
}
|
1349
|
-
rel = rel.slice(i).join(".");
|
1350
|
-
name = current.name + (current.name && rel ? "." : "") + rel;
|
1351
|
-
}
|
1352
|
-
var state = states[name];
|
1353
|
-
|
1354
|
-
if (state && (isStr || (!isStr && (state === stateOrName || state.self === stateOrName)))) {
|
1355
|
-
return state;
|
1356
|
-
}
|
1357
|
-
return undefined;
|
1358
|
-
}
|
1359
|
-
|
1360
|
-
function queueState(parentName, state) {
|
1361
|
-
if (!queue[parentName]) {
|
1362
|
-
queue[parentName] = [];
|
1363
|
-
}
|
1364
|
-
queue[parentName].push(state);
|
1365
|
-
}
|
1366
|
-
|
1367
|
-
function registerState(state) {
|
1368
|
-
// Wrap a new object around the state so we can store our private details easily.
|
1369
|
-
state = inherit(state, {
|
1370
|
-
self: state,
|
1371
|
-
resolve: state.resolve || {},
|
1372
|
-
toString: function() { return this.name; }
|
1373
|
-
});
|
1374
|
-
|
1375
|
-
var name = state.name;
|
1376
|
-
if (!isString(name) || name.indexOf('@') >= 0) throw new Error("State must have a valid name");
|
1377
|
-
if (states.hasOwnProperty(name)) throw new Error("State '" + name + "'' is already defined");
|
1378
|
-
|
1379
|
-
// Get parent name
|
1380
|
-
var parentName = (name.indexOf('.') !== -1) ? name.substring(0, name.lastIndexOf('.'))
|
1381
|
-
: (isString(state.parent)) ? state.parent
|
1382
|
-
: '';
|
1383
|
-
|
1384
|
-
// If parent is not registered yet, add state to queue and register later
|
1385
|
-
if (parentName && !states[parentName]) {
|
1386
|
-
return queueState(parentName, state.self);
|
1387
|
-
}
|
1388
|
-
|
1389
|
-
for (var key in stateBuilder) {
|
1390
|
-
if (isFunction(stateBuilder[key])) state[key] = stateBuilder[key](state, stateBuilder.$delegates[key]);
|
1391
|
-
}
|
1392
|
-
states[name] = state;
|
1393
|
-
|
1394
|
-
// Register the state in the global state list and with $urlRouter if necessary.
|
1395
|
-
if (!state[abstractKey] && state.url) {
|
1396
|
-
$urlRouterProvider.when(state.url, ['$match', '$stateParams', function ($match, $stateParams) {
|
1397
|
-
if ($state.$current.navigable != state || !equalForKeys($match, $stateParams)) {
|
1398
|
-
$state.transitionTo(state, $match, { location: false });
|
1399
|
-
}
|
1400
|
-
}]);
|
1401
|
-
}
|
1402
|
-
|
1403
|
-
// Register any queued children
|
1404
|
-
if (queue[name]) {
|
1405
|
-
for (var i = 0; i < queue[name].length; i++) {
|
1406
|
-
registerState(queue[name][i]);
|
1407
|
-
}
|
1408
|
-
}
|
1409
|
-
|
1410
|
-
return state;
|
1411
|
-
}
|
1412
|
-
|
1413
|
-
// Checks text to see if it looks like a glob.
|
1414
|
-
function isGlob (text) {
|
1415
|
-
return text.indexOf('*') > -1;
|
1416
|
-
}
|
1417
|
-
|
1418
|
-
// Returns true if glob matches current $state name.
|
1419
|
-
function doesStateMatchGlob (glob) {
|
1420
|
-
var globSegments = glob.split('.'),
|
1421
|
-
segments = $state.$current.name.split('.');
|
1422
|
-
|
1423
|
-
//match greedy starts
|
1424
|
-
if (globSegments[0] === '**') {
|
1425
|
-
segments = segments.slice(segments.indexOf(globSegments[1]));
|
1426
|
-
segments.unshift('**');
|
1427
|
-
}
|
1428
|
-
//match greedy ends
|
1429
|
-
if (globSegments[globSegments.length - 1] === '**') {
|
1430
|
-
segments.splice(segments.indexOf(globSegments[globSegments.length - 2]) + 1, Number.MAX_VALUE);
|
1431
|
-
segments.push('**');
|
1432
|
-
}
|
1433
|
-
|
1434
|
-
if (globSegments.length != segments.length) {
|
1435
|
-
return false;
|
1436
|
-
}
|
1437
|
-
|
1438
|
-
//match single stars
|
1439
|
-
for (var i = 0, l = globSegments.length; i < l; i++) {
|
1440
|
-
if (globSegments[i] === '*') {
|
1441
|
-
segments[i] = '*';
|
1442
|
-
}
|
1443
|
-
}
|
1444
|
-
|
1445
|
-
return segments.join('') === globSegments.join('');
|
1446
|
-
}
|
1447
|
-
|
1448
|
-
|
1449
|
-
// Implicit root state that is always active
|
1450
|
-
root = registerState({
|
1451
|
-
name: '',
|
1452
|
-
url: '^',
|
1453
|
-
views: null,
|
1454
|
-
'abstract': true
|
1455
|
-
});
|
1456
|
-
root.navigable = null;
|
1457
|
-
|
1458
|
-
|
1459
|
-
/**
|
1460
|
-
* @ngdoc function
|
1461
|
-
* @name ui.router.state.$stateProvider#decorator
|
1462
|
-
* @methodOf ui.router.state.$stateProvider
|
1463
|
-
*
|
1464
|
-
* @description
|
1465
|
-
* Allows you to extend (carefully) or override (at your own peril) the
|
1466
|
-
* `stateBuilder` object used internally by `$stateProvider`. This can be used
|
1467
|
-
* to add custom functionality to ui-router, for example inferring templateUrl
|
1468
|
-
* based on the state name.
|
1469
|
-
*
|
1470
|
-
* When passing only a name, it returns the current (original or decorated) builder
|
1471
|
-
* function that matches `name`.
|
1472
|
-
*
|
1473
|
-
* The builder functions that can be decorated are listed below. Though not all
|
1474
|
-
* necessarily have a good use case for decoration, that is up to you to decide.
|
1475
|
-
*
|
1476
|
-
* In addition, users can attach custom decorators, which will generate new
|
1477
|
-
* properties within the state's internal definition. There is currently no clear
|
1478
|
-
* use-case for this beyond accessing internal states (i.e. $state.$current),
|
1479
|
-
* however, expect this to become increasingly relevant as we introduce additional
|
1480
|
-
* meta-programming features.
|
1481
|
-
*
|
1482
|
-
* **Warning**: Decorators should not be interdependent because the order of
|
1483
|
-
* execution of the builder functions in non-deterministic. Builder functions
|
1484
|
-
* should only be dependent on the state definition object and super function.
|
1485
|
-
*
|
1486
|
-
*
|
1487
|
-
* Existing builder functions and current return values:
|
1488
|
-
*
|
1489
|
-
* - **parent** `{object}` - returns the parent state object.
|
1490
|
-
* - **data** `{object}` - returns state data, including any inherited data that is not
|
1491
|
-
* overridden by own values (if any).
|
1492
|
-
* - **url** `{object}` - returns a {link ui.router.util.type:UrlMatcher} or null.
|
1493
|
-
* - **navigable** `{object}` - returns closest ancestor state that has a URL (aka is
|
1494
|
-
* navigable).
|
1495
|
-
* - **params** `{object}` - returns an array of state params that are ensured to
|
1496
|
-
* be a super-set of parent's params.
|
1497
|
-
* - **views** `{object}` - returns a views object where each key is an absolute view
|
1498
|
-
* name (i.e. "viewName@stateName") and each value is the config object
|
1499
|
-
* (template, controller) for the view. Even when you don't use the views object
|
1500
|
-
* explicitly on a state config, one is still created for you internally.
|
1501
|
-
* So by decorating this builder function you have access to decorating template
|
1502
|
-
* and controller properties.
|
1503
|
-
* - **ownParams** `{object}` - returns an array of params that belong to the state,
|
1504
|
-
* not including any params defined by ancestor states.
|
1505
|
-
* - **path** `{string}` - returns the full path from the root down to this state.
|
1506
|
-
* Needed for state activation.
|
1507
|
-
* - **includes** `{object}` - returns an object that includes every state that
|
1508
|
-
* would pass a '$state.includes()' test.
|
1509
|
-
*
|
1510
|
-
* @example
|
1511
|
-
* <pre>
|
1512
|
-
* // Override the internal 'views' builder with a function that takes the state
|
1513
|
-
* // definition, and a reference to the internal function being overridden:
|
1514
|
-
* $stateProvider.decorator('views', function ($state, parent) {
|
1515
|
-
* var result = {},
|
1516
|
-
* views = parent(state);
|
1517
|
-
*
|
1518
|
-
* angular.forEach(view, function (config, name) {
|
1519
|
-
* var autoName = (state.name + '.' + name).replace('.', '/');
|
1520
|
-
* config.templateUrl = config.templateUrl || '/partials/' + autoName + '.html';
|
1521
|
-
* result[name] = config;
|
1522
|
-
* });
|
1523
|
-
* return result;
|
1524
|
-
* });
|
1525
|
-
*
|
1526
|
-
* $stateProvider.state('home', {
|
1527
|
-
* views: {
|
1528
|
-
* 'contact.list': { controller: 'ListController' },
|
1529
|
-
* 'contact.item': { controller: 'ItemController' }
|
1530
|
-
* }
|
1531
|
-
* });
|
1532
|
-
*
|
1533
|
-
* // ...
|
1534
|
-
*
|
1535
|
-
* $state.go('home');
|
1536
|
-
* // Auto-populates list and item views with /partials/home/contact/list.html,
|
1537
|
-
* // and /partials/home/contact/item.html, respectively.
|
1538
|
-
* </pre>
|
1539
|
-
*
|
1540
|
-
* @param {string} name The name of the builder function to decorate.
|
1541
|
-
* @param {object} func A function that is responsible for decorating the original
|
1542
|
-
* builder function. The function receives two parameters:
|
1543
|
-
*
|
1544
|
-
* - `{object}` - state - The state config object.
|
1545
|
-
* - `{object}` - super - The original builder function.
|
1546
|
-
*
|
1547
|
-
* @return {object} $stateProvider - $stateProvider instance
|
1548
|
-
*/
|
1549
|
-
this.decorator = decorator;
|
1550
|
-
function decorator(name, func) {
|
1551
|
-
/*jshint validthis: true */
|
1552
|
-
if (isString(name) && !isDefined(func)) {
|
1553
|
-
return stateBuilder[name];
|
1554
|
-
}
|
1555
|
-
if (!isFunction(func) || !isString(name)) {
|
1556
|
-
return this;
|
1557
|
-
}
|
1558
|
-
if (stateBuilder[name] && !stateBuilder.$delegates[name]) {
|
1559
|
-
stateBuilder.$delegates[name] = stateBuilder[name];
|
1560
|
-
}
|
1561
|
-
stateBuilder[name] = func;
|
1562
|
-
return this;
|
1563
|
-
}
|
1564
|
-
|
1565
|
-
/**
|
1566
|
-
* @ngdoc function
|
1567
|
-
* @name ui.router.state.$stateProvider#state
|
1568
|
-
* @methodOf ui.router.state.$stateProvider
|
1569
|
-
*
|
1570
|
-
* @description
|
1571
|
-
* Registers a state configuration under a given state name. The stateConfig object
|
1572
|
-
* has the following acceptable properties.
|
1573
|
-
*
|
1574
|
-
* <a id='template'></a>
|
1575
|
-
*
|
1576
|
-
* - **`template`** - {string|function=} - html template as a string or a function that returns
|
1577
|
-
* an html template as a string which should be used by the uiView directives. This property
|
1578
|
-
* takes precedence over templateUrl.
|
1579
|
-
*
|
1580
|
-
* If `template` is a function, it will be called with the following parameters:
|
1581
|
-
*
|
1582
|
-
* - {array.<object>} - state parameters extracted from the current $location.path() by
|
1583
|
-
* applying the current state
|
1584
|
-
*
|
1585
|
-
* <a id='templateUrl'></a>
|
1586
|
-
*
|
1587
|
-
* - **`templateUrl`** - {string|function=} - path or function that returns a path to an html
|
1588
|
-
* template that should be used by uiView.
|
1589
|
-
*
|
1590
|
-
* If `templateUrl` is a function, it will be called with the following parameters:
|
1591
|
-
*
|
1592
|
-
* - {array.<object>} - state parameters extracted from the current $location.path() by
|
1593
|
-
* applying the current state
|
1594
|
-
*
|
1595
|
-
* <a id='templateProvider'></a>
|
1596
|
-
*
|
1597
|
-
* - **`templateProvider`** - {function=} - Provider function that returns HTML content
|
1598
|
-
* string.
|
1599
|
-
*
|
1600
|
-
* <a id='controller'></a>
|
1601
|
-
*
|
1602
|
-
* - **`controller`** - {string|function=} - Controller fn that should be associated with newly
|
1603
|
-
* related scope or the name of a registered controller if passed as a string.
|
1604
|
-
*
|
1605
|
-
* <a id='controllerProvider'></a>
|
1606
|
-
*
|
1607
|
-
* - **`controllerProvider`** - {function=} - Injectable provider function that returns
|
1608
|
-
* the actual controller or string.
|
1609
|
-
*
|
1610
|
-
* <a id='controllerAs'></a>
|
1611
|
-
*
|
1612
|
-
* - **`controllerAs`** – {string=} – A controller alias name. If present the controller will be
|
1613
|
-
* published to scope under the controllerAs name.
|
1614
|
-
*
|
1615
|
-
* <a id='resolve'></a>
|
1616
|
-
*
|
1617
|
-
* - **`resolve`** - {object.<string, function>=} - An optional map of dependencies which
|
1618
|
-
* should be injected into the controller. If any of these dependencies are promises,
|
1619
|
-
* the router will wait for them all to be resolved or one to be rejected before the
|
1620
|
-
* controller is instantiated. If all the promises are resolved successfully, the values
|
1621
|
-
* of the resolved promises are injected and $stateChangeSuccess event is fired. If any
|
1622
|
-
* of the promises are rejected the $stateChangeError event is fired. The map object is:
|
1623
|
-
*
|
1624
|
-
* - key - {string}: name of dependency to be injected into controller
|
1625
|
-
* - factory - {string|function}: If string then it is alias for service. Otherwise if function,
|
1626
|
-
* it is injected and return value it treated as dependency. If result is a promise, it is
|
1627
|
-
* resolved before its value is injected into controller.
|
1628
|
-
*
|
1629
|
-
* <a id='url'></a>
|
1630
|
-
*
|
1631
|
-
* - **`url`** - {string=} - A url with optional parameters. When a state is navigated or
|
1632
|
-
* transitioned to, the `$stateParams` service will be populated with any
|
1633
|
-
* parameters that were passed.
|
1634
|
-
*
|
1635
|
-
* <a id='params'></a>
|
1636
|
-
*
|
1637
|
-
* - **`params`** - {object=} - An array of parameter names or regular expressions. Only
|
1638
|
-
* use this within a state if you are not using url. Otherwise you can specify your
|
1639
|
-
* parameters within the url. When a state is navigated or transitioned to, the
|
1640
|
-
* $stateParams service will be populated with any parameters that were passed.
|
1641
|
-
*
|
1642
|
-
* <a id='views'></a>
|
1643
|
-
*
|
1644
|
-
* - **`views`** - {object=} - Use the views property to set up multiple views or to target views
|
1645
|
-
* manually/explicitly.
|
1646
|
-
*
|
1647
|
-
* <a id='abstract'></a>
|
1648
|
-
*
|
1649
|
-
* - **`abstract`** - {boolean=} - An abstract state will never be directly activated,
|
1650
|
-
* but can provide inherited properties to its common children states.
|
1651
|
-
*
|
1652
|
-
* <a id='onEnter'></a>
|
1653
|
-
*
|
1654
|
-
* - **`onEnter`** - {object=} - Callback function for when a state is entered. Good way
|
1655
|
-
* to trigger an action or dispatch an event, such as opening a dialog.
|
1656
|
-
*
|
1657
|
-
* <a id='onExit'></a>
|
1658
|
-
*
|
1659
|
-
* - **`onExit`** - {object=} - Callback function for when a state is exited. Good way to
|
1660
|
-
* trigger an action or dispatch an event, such as opening a dialog.
|
1661
|
-
*
|
1662
|
-
* <a id='reloadOnSearch'></a>
|
1663
|
-
*
|
1664
|
-
* - **`reloadOnSearch = true`** - {boolean=} - If `false`, will not retrigger the same state
|
1665
|
-
* just because a search/query parameter has changed (via $location.search() or $location.hash()).
|
1666
|
-
* Useful for when you'd like to modify $location.search() without triggering a reload.
|
1667
|
-
*
|
1668
|
-
* <a id='data'></a>
|
1669
|
-
*
|
1670
|
-
* - **`data`** - {object=} - Arbitrary data object, useful for custom configuration.
|
1671
|
-
*
|
1672
|
-
* @example
|
1673
|
-
* <pre>
|
1674
|
-
* // Some state name examples
|
1675
|
-
*
|
1676
|
-
* // stateName can be a single top-level name (must be unique).
|
1677
|
-
* $stateProvider.state("home", {});
|
1678
|
-
*
|
1679
|
-
* // Or it can be a nested state name. This state is a child of the
|
1680
|
-
* // above "home" state.
|
1681
|
-
* $stateProvider.state("home.newest", {});
|
1682
|
-
*
|
1683
|
-
* // Nest states as deeply as needed.
|
1684
|
-
* $stateProvider.state("home.newest.abc.xyz.inception", {});
|
1685
|
-
*
|
1686
|
-
* // state() returns $stateProvider, so you can chain state declarations.
|
1687
|
-
* $stateProvider
|
1688
|
-
* .state("home", {})
|
1689
|
-
* .state("about", {})
|
1690
|
-
* .state("contacts", {});
|
1691
|
-
* </pre>
|
1692
|
-
*
|
1693
|
-
* @param {string} name A unique state name, e.g. "home", "about", "contacts".
|
1694
|
-
* To create a parent/child state use a dot, e.g. "about.sales", "home.newest".
|
1695
|
-
* @param {object} definition State configuration object.
|
1696
|
-
*/
|
1697
|
-
this.state = state;
|
1698
|
-
function state(name, definition) {
|
1699
|
-
/*jshint validthis: true */
|
1700
|
-
if (isObject(name)) definition = name;
|
1701
|
-
else definition.name = name;
|
1702
|
-
registerState(definition);
|
1703
|
-
return this;
|
1704
|
-
}
|
1705
|
-
|
1706
|
-
/**
|
1707
|
-
* @ngdoc object
|
1708
|
-
* @name ui.router.state.$state
|
1709
|
-
*
|
1710
|
-
* @requires $rootScope
|
1711
|
-
* @requires $q
|
1712
|
-
* @requires ui.router.state.$view
|
1713
|
-
* @requires $injector
|
1714
|
-
* @requires ui.router.util.$resolve
|
1715
|
-
* @requires ui.router.state.$stateParams
|
1716
|
-
*
|
1717
|
-
* @property {object} params A param object, e.g. {sectionId: section.id)}, that
|
1718
|
-
* you'd like to test against the current active state.
|
1719
|
-
* @property {object} current A reference to the state's config object. However
|
1720
|
-
* you passed it in. Useful for accessing custom data.
|
1721
|
-
* @property {object} transition Currently pending transition. A promise that'll
|
1722
|
-
* resolve or reject.
|
1723
|
-
*
|
1724
|
-
* @description
|
1725
|
-
* `$state` service is responsible for representing states as well as transitioning
|
1726
|
-
* between them. It also provides interfaces to ask for current state or even states
|
1727
|
-
* you're coming from.
|
1728
|
-
*/
|
1729
|
-
// $urlRouter is injected just to ensure it gets instantiated
|
1730
|
-
this.$get = $get;
|
1731
|
-
$get.$inject = ['$rootScope', '$q', '$view', '$injector', '$resolve', '$stateParams', '$location', '$urlRouter', '$browser'];
|
1732
|
-
function $get( $rootScope, $q, $view, $injector, $resolve, $stateParams, $location, $urlRouter, $browser) {
|
1733
|
-
|
1734
|
-
var TransitionSuperseded = $q.reject(new Error('transition superseded'));
|
1735
|
-
var TransitionPrevented = $q.reject(new Error('transition prevented'));
|
1736
|
-
var TransitionAborted = $q.reject(new Error('transition aborted'));
|
1737
|
-
var TransitionFailed = $q.reject(new Error('transition failed'));
|
1738
|
-
var currentLocation = $location.url();
|
1739
|
-
var baseHref = $browser.baseHref();
|
1740
|
-
|
1741
|
-
function syncUrl() {
|
1742
|
-
if ($location.url() !== currentLocation) {
|
1743
|
-
$location.url(currentLocation);
|
1744
|
-
$location.replace();
|
1745
|
-
}
|
1746
|
-
}
|
1747
|
-
|
1748
|
-
root.locals = { resolve: null, globals: { $stateParams: {} } };
|
1749
|
-
$state = {
|
1750
|
-
params: {},
|
1751
|
-
current: root.self,
|
1752
|
-
$current: root,
|
1753
|
-
transition: null
|
1754
|
-
};
|
1755
|
-
|
1756
|
-
/**
|
1757
|
-
* @ngdoc function
|
1758
|
-
* @name ui.router.state.$state#reload
|
1759
|
-
* @methodOf ui.router.state.$state
|
1760
|
-
*
|
1761
|
-
* @description
|
1762
|
-
* A method that force reloads the current state. All resolves are re-resolved, events are not re-fired,
|
1763
|
-
* and controllers reinstantiated (bug with controllers reinstantiating right now, fixing soon).
|
1764
|
-
*
|
1765
|
-
* @example
|
1766
|
-
* <pre>
|
1767
|
-
* var app angular.module('app', ['ui.router']);
|
1768
|
-
*
|
1769
|
-
* app.controller('ctrl', function ($scope, $state) {
|
1770
|
-
* $scope.reload = function(){
|
1771
|
-
* $state.reload();
|
1772
|
-
* }
|
1773
|
-
* });
|
1774
|
-
* </pre>
|
1775
|
-
*
|
1776
|
-
* `reload()` is just an alias for:
|
1777
|
-
* <pre>
|
1778
|
-
* $state.transitionTo($state.current, $stateParams, {
|
1779
|
-
* reload: true, inherit: false, notify: false
|
1780
|
-
* });
|
1781
|
-
* </pre>
|
1782
|
-
*/
|
1783
|
-
$state.reload = function reload() {
|
1784
|
-
$state.transitionTo($state.current, $stateParams, { reload: true, inherit: false, notify: false });
|
1785
|
-
};
|
1786
|
-
|
1787
|
-
/**
|
1788
|
-
* @ngdoc function
|
1789
|
-
* @name ui.router.state.$state#go
|
1790
|
-
* @methodOf ui.router.state.$state
|
1791
|
-
*
|
1792
|
-
* @description
|
1793
|
-
* Convenience method for transitioning to a new state. `$state.go` calls
|
1794
|
-
* `$state.transitionTo` internally but automatically sets options to
|
1795
|
-
* `{ location: true, inherit: true, relative: $state.$current, notify: true }`.
|
1796
|
-
* This allows you to easily use an absolute or relative to path and specify
|
1797
|
-
* only the parameters you'd like to update (while letting unspecified parameters
|
1798
|
-
* inherit from the currently active ancestor states).
|
1799
|
-
*
|
1800
|
-
* @example
|
1801
|
-
* <pre>
|
1802
|
-
* var app = angular.module('app', ['ui.router']);
|
1803
|
-
*
|
1804
|
-
* app.controller('ctrl', function ($scope, $state) {
|
1805
|
-
* $scope.changeState = function () {
|
1806
|
-
* $state.go('contact.detail');
|
1807
|
-
* };
|
1808
|
-
* });
|
1809
|
-
* </pre>
|
1810
|
-
* <img src='../ngdoc_assets/StateGoExamples.png'/>
|
1811
|
-
*
|
1812
|
-
* @param {string} to Absolute state name or relative state path. Some examples:
|
1813
|
-
*
|
1814
|
-
* - `$state.go('contact.detail')` - will go to the `contact.detail` state
|
1815
|
-
* - `$state.go('^')` - will go to a parent state
|
1816
|
-
* - `$state.go('^.sibling')` - will go to a sibling state
|
1817
|
-
* - `$state.go('.child.grandchild')` - will go to grandchild state
|
1818
|
-
*
|
1819
|
-
* @param {object=} params A map of the parameters that will be sent to the state,
|
1820
|
-
* will populate $stateParams. Any parameters that are not specified will be inherited from currently
|
1821
|
-
* defined parameters. This allows, for example, going to a sibling state that shares parameters
|
1822
|
-
* specified in a parent state. Parameter inheritance only works between common ancestor states, I.e.
|
1823
|
-
* transitioning to a sibling will get you the parameters for all parents, transitioning to a child
|
1824
|
-
* will get you all current parameters, etc.
|
1825
|
-
* @param {object=} options Options object. The options are:
|
1826
|
-
*
|
1827
|
-
* - **`location`** - {boolean=true|string=} - If `true` will update the url in the location bar, if `false`
|
1828
|
-
* will not. If string, must be `"replace"`, which will update url and also replace last history record.
|
1829
|
-
* - **`inherit`** - {boolean=true}, If `true` will inherit url parameters from current url.
|
1830
|
-
* - **`relative`** - {object=$state.$current}, When transitioning with relative path (e.g '^'),
|
1831
|
-
* defines which state to be relative from.
|
1832
|
-
* - **`notify`** - {boolean=true}, If `true` will broadcast $stateChangeStart and $stateChangeSuccess events.
|
1833
|
-
* - **`reload`** (v0.2.5) - {boolean=false}, If `true` will force transition even if the state or params
|
1834
|
-
* have not changed, aka a reload of the same state. It differs from reloadOnSearch because you'd
|
1835
|
-
* use this when you want to force a reload when *everything* is the same, including search params.
|
1836
|
-
*
|
1837
|
-
* @returns {promise} A promise representing the state of the new transition.
|
1838
|
-
*
|
1839
|
-
* Possible success values:
|
1840
|
-
*
|
1841
|
-
* - $state.current
|
1842
|
-
*
|
1843
|
-
* <br/>Possible rejection values:
|
1844
|
-
*
|
1845
|
-
* - 'transition superseded' - when a newer transition has been started after this one
|
1846
|
-
* - 'transition prevented' - when `event.preventDefault()` has been called in a `$stateChangeStart` listener
|
1847
|
-
* - 'transition aborted' - when `event.preventDefault()` has been called in a `$stateNotFound` listener or
|
1848
|
-
* when a `$stateNotFound` `event.retry` promise errors.
|
1849
|
-
* - 'transition failed' - when a state has been unsuccessfully found after 2 tries.
|
1850
|
-
* - *resolve error* - when an error has occurred with a `resolve`
|
1851
|
-
*
|
1852
|
-
*/
|
1853
|
-
$state.go = function go(to, params, options) {
|
1854
|
-
return this.transitionTo(to, params, extend({ inherit: true, relative: $state.$current }, options));
|
1855
|
-
};
|
1856
|
-
|
1857
|
-
/**
|
1858
|
-
* @ngdoc function
|
1859
|
-
* @name ui.router.state.$state#transitionTo
|
1860
|
-
* @methodOf ui.router.state.$state
|
1861
|
-
*
|
1862
|
-
* @description
|
1863
|
-
* Low-level method for transitioning to a new state. {@link ui.router.state.$state#methods_go $state.go}
|
1864
|
-
* uses `transitionTo` internally. `$state.go` is recommended in most situations.
|
1865
|
-
*
|
1866
|
-
* @example
|
1867
|
-
* <pre>
|
1868
|
-
* var app = angular.module('app', ['ui.router']);
|
1869
|
-
*
|
1870
|
-
* app.controller('ctrl', function ($scope, $state) {
|
1871
|
-
* $scope.changeState = function () {
|
1872
|
-
* $state.transitionTo('contact.detail');
|
1873
|
-
* };
|
1874
|
-
* });
|
1875
|
-
* </pre>
|
1876
|
-
*
|
1877
|
-
* @param {string} to State name.
|
1878
|
-
* @param {object=} toParams A map of the parameters that will be sent to the state,
|
1879
|
-
* will populate $stateParams.
|
1880
|
-
* @param {object=} options Options object. The options are:
|
1881
|
-
*
|
1882
|
-
* - **`location`** - {boolean=true|string=} - If `true` will update the url in the location bar, if `false`
|
1883
|
-
* will not. If string, must be `"replace"`, which will update url and also replace last history record.
|
1884
|
-
* - **`inherit`** - {boolean=false}, If `true` will inherit url parameters from current url.
|
1885
|
-
* - **`relative`** - {object=}, When transitioning with relative path (e.g '^'),
|
1886
|
-
* defines which state to be relative from.
|
1887
|
-
* - **`notify`** - {boolean=true}, If `true` will broadcast $stateChangeStart and $stateChangeSuccess events.
|
1888
|
-
* - **`reload`** (v0.2.5) - {boolean=false}, If `true` will force transition even if the state or params
|
1889
|
-
* have not changed, aka a reload of the same state. It differs from reloadOnSearch because you'd
|
1890
|
-
* use this when you want to force a reload when *everything* is the same, including search params.
|
1891
|
-
*
|
1892
|
-
* @returns {promise} A promise representing the state of the new transition. See
|
1893
|
-
* {@link ui.router.state.$state#methods_go $state.go}.
|
1894
|
-
*/
|
1895
|
-
$state.transitionTo = function transitionTo(to, toParams, options) {
|
1896
|
-
toParams = toParams || {};
|
1897
|
-
options = extend({
|
1898
|
-
location: true, inherit: false, relative: null, notify: true, reload: false, $retry: false
|
1899
|
-
}, options || {});
|
1900
|
-
|
1901
|
-
var from = $state.$current, fromParams = $state.params, fromPath = from.path;
|
1902
|
-
var evt, toState = findState(to, options.relative);
|
1903
|
-
|
1904
|
-
if (!isDefined(toState)) {
|
1905
|
-
// Broadcast not found event and abort the transition if prevented
|
1906
|
-
var redirect = { to: to, toParams: toParams, options: options };
|
1907
|
-
|
1908
|
-
/**
|
1909
|
-
* @ngdoc event
|
1910
|
-
* @name ui.router.state.$state#$stateNotFound
|
1911
|
-
* @eventOf ui.router.state.$state
|
1912
|
-
* @eventType broadcast on root scope
|
1913
|
-
* @description
|
1914
|
-
* Fired when a requested state **cannot be found** using the provided state name during transition.
|
1915
|
-
* The event is broadcast allowing any handlers a single chance to deal with the error (usually by
|
1916
|
-
* lazy-loading the unfound state). A special `unfoundState` object is passed to the listener handler,
|
1917
|
-
* you can see its three properties in the example. You can use `event.preventDefault()` to abort the
|
1918
|
-
* transition and the promise returned from `go` will be rejected with a `'transition aborted'` value.
|
1919
|
-
*
|
1920
|
-
* @param {Object} event Event object.
|
1921
|
-
* @param {Object} unfoundState Unfound State information. Contains: `to, toParams, options` properties.
|
1922
|
-
* @param {State} fromState Current state object.
|
1923
|
-
* @param {Object} fromParams Current state params.
|
1924
|
-
*
|
1925
|
-
* @example
|
1926
|
-
*
|
1927
|
-
* <pre>
|
1928
|
-
* // somewhere, assume lazy.state has not been defined
|
1929
|
-
* $state.go("lazy.state", {a:1, b:2}, {inherit:false});
|
1930
|
-
*
|
1931
|
-
* // somewhere else
|
1932
|
-
* $scope.$on('$stateNotFound',
|
1933
|
-
* function(event, unfoundState, fromState, fromParams){
|
1934
|
-
* console.log(unfoundState.to); // "lazy.state"
|
1935
|
-
* console.log(unfoundState.toParams); // {a:1, b:2}
|
1936
|
-
* console.log(unfoundState.options); // {inherit:false} + default options
|
1937
|
-
* })
|
1938
|
-
* </pre>
|
1939
|
-
*/
|
1940
|
-
evt = $rootScope.$broadcast('$stateNotFound', redirect, from.self, fromParams);
|
1941
|
-
if (evt.defaultPrevented) {
|
1942
|
-
syncUrl();
|
1943
|
-
return TransitionAborted;
|
1944
|
-
}
|
1945
|
-
|
1946
|
-
// Allow the handler to return a promise to defer state lookup retry
|
1947
|
-
if (evt.retry) {
|
1948
|
-
if (options.$retry) {
|
1949
|
-
syncUrl();
|
1950
|
-
return TransitionFailed;
|
1951
|
-
}
|
1952
|
-
var retryTransition = $state.transition = $q.when(evt.retry);
|
1953
|
-
retryTransition.then(function() {
|
1954
|
-
if (retryTransition !== $state.transition) return TransitionSuperseded;
|
1955
|
-
redirect.options.$retry = true;
|
1956
|
-
return $state.transitionTo(redirect.to, redirect.toParams, redirect.options);
|
1957
|
-
}, function() {
|
1958
|
-
return TransitionAborted;
|
1959
|
-
});
|
1960
|
-
syncUrl();
|
1961
|
-
return retryTransition;
|
1962
|
-
}
|
1963
|
-
|
1964
|
-
// Always retry once if the $stateNotFound was not prevented
|
1965
|
-
// (handles either redirect changed or state lazy-definition)
|
1966
|
-
to = redirect.to;
|
1967
|
-
toParams = redirect.toParams;
|
1968
|
-
options = redirect.options;
|
1969
|
-
toState = findState(to, options.relative);
|
1970
|
-
if (!isDefined(toState)) {
|
1971
|
-
if (options.relative) throw new Error("Could not resolve '" + to + "' from state '" + options.relative + "'");
|
1972
|
-
throw new Error("No such state '" + to + "'");
|
1973
|
-
}
|
1974
|
-
}
|
1975
|
-
if (toState[abstractKey]) throw new Error("Cannot transition to abstract state '" + to + "'");
|
1976
|
-
if (options.inherit) toParams = inheritParams($stateParams, toParams || {}, $state.$current, toState);
|
1977
|
-
to = toState;
|
1978
|
-
|
1979
|
-
var toPath = to.path;
|
1980
|
-
|
1981
|
-
// Starting from the root of the path, keep all levels that haven't changed
|
1982
|
-
var keep, state, locals = root.locals, toLocals = [];
|
1983
|
-
for (keep = 0, state = toPath[keep];
|
1984
|
-
state && state === fromPath[keep] && equalForKeys(toParams, fromParams, state.ownParams) && !options.reload;
|
1985
|
-
keep++, state = toPath[keep]) {
|
1986
|
-
locals = toLocals[keep] = state.locals;
|
1987
|
-
}
|
1988
|
-
|
1989
|
-
// If we're going to the same state and all locals are kept, we've got nothing to do.
|
1990
|
-
// But clear 'transition', as we still want to cancel any other pending transitions.
|
1991
|
-
// TODO: We may not want to bump 'transition' if we're called from a location change that we've initiated ourselves,
|
1992
|
-
// because we might accidentally abort a legitimate transition initiated from code?
|
1993
|
-
if (shouldTriggerReload(to, from, locals, options) ) {
|
1994
|
-
if ( to.self.reloadOnSearch !== false )
|
1995
|
-
syncUrl();
|
1996
|
-
$state.transition = null;
|
1997
|
-
return $q.when($state.current);
|
1998
|
-
}
|
1999
|
-
|
2000
|
-
// Normalize/filter parameters before we pass them to event handlers etc.
|
2001
|
-
toParams = normalize(to.params, toParams || {});
|
2002
|
-
|
2003
|
-
// Broadcast start event and cancel the transition if requested
|
2004
|
-
if (options.notify) {
|
2005
|
-
/**
|
2006
|
-
* @ngdoc event
|
2007
|
-
* @name ui.router.state.$state#$stateChangeStart
|
2008
|
-
* @eventOf ui.router.state.$state
|
2009
|
-
* @eventType broadcast on root scope
|
2010
|
-
* @description
|
2011
|
-
* Fired when the state transition **begins**. You can use `event.preventDefault()`
|
2012
|
-
* to prevent the transition from happening and then the transition promise will be
|
2013
|
-
* rejected with a `'transition prevented'` value.
|
2014
|
-
*
|
2015
|
-
* @param {Object} event Event object.
|
2016
|
-
* @param {State} toState The state being transitioned to.
|
2017
|
-
* @param {Object} toParams The params supplied to the `toState`.
|
2018
|
-
* @param {State} fromState The current state, pre-transition.
|
2019
|
-
* @param {Object} fromParams The params supplied to the `fromState`.
|
2020
|
-
*
|
2021
|
-
* @example
|
2022
|
-
*
|
2023
|
-
* <pre>
|
2024
|
-
* $rootScope.$on('$stateChangeStart',
|
2025
|
-
* function(event, toState, toParams, fromState, fromParams){
|
2026
|
-
* event.preventDefault();
|
2027
|
-
* // transitionTo() promise will be rejected with
|
2028
|
-
* // a 'transition prevented' error
|
2029
|
-
* })
|
2030
|
-
* </pre>
|
2031
|
-
*/
|
2032
|
-
evt = $rootScope.$broadcast('$stateChangeStart', to.self, toParams, from.self, fromParams);
|
2033
|
-
if (evt.defaultPrevented) {
|
2034
|
-
syncUrl();
|
2035
|
-
return TransitionPrevented;
|
2036
|
-
}
|
2037
|
-
}
|
2038
|
-
|
2039
|
-
// Resolve locals for the remaining states, but don't update any global state just
|
2040
|
-
// yet -- if anything fails to resolve the current state needs to remain untouched.
|
2041
|
-
// We also set up an inheritance chain for the locals here. This allows the view directive
|
2042
|
-
// to quickly look up the correct definition for each view in the current state. Even
|
2043
|
-
// though we create the locals object itself outside resolveState(), it is initially
|
2044
|
-
// empty and gets filled asynchronously. We need to keep track of the promise for the
|
2045
|
-
// (fully resolved) current locals, and pass this down the chain.
|
2046
|
-
var resolved = $q.when(locals);
|
2047
|
-
for (var l=keep; l<toPath.length; l++, state=toPath[l]) {
|
2048
|
-
locals = toLocals[l] = inherit(locals);
|
2049
|
-
resolved = resolveState(state, toParams, state===to, resolved, locals);
|
2050
|
-
}
|
2051
|
-
|
2052
|
-
// Once everything is resolved, we are ready to perform the actual transition
|
2053
|
-
// and return a promise for the new state. We also keep track of what the
|
2054
|
-
// current promise is, so that we can detect overlapping transitions and
|
2055
|
-
// keep only the outcome of the last transition.
|
2056
|
-
var transition = $state.transition = resolved.then(function () {
|
2057
|
-
var l, entering, exiting;
|
2058
|
-
|
2059
|
-
if ($state.transition !== transition) return TransitionSuperseded;
|
2060
|
-
|
2061
|
-
// Exit 'from' states not kept
|
2062
|
-
for (l=fromPath.length-1; l>=keep; l--) {
|
2063
|
-
exiting = fromPath[l];
|
2064
|
-
if (exiting.self.onExit) {
|
2065
|
-
$injector.invoke(exiting.self.onExit, exiting.self, exiting.locals.globals);
|
2066
|
-
}
|
2067
|
-
exiting.locals = null;
|
2068
|
-
}
|
2069
|
-
|
2070
|
-
// Enter 'to' states not kept
|
2071
|
-
for (l=keep; l<toPath.length; l++) {
|
2072
|
-
entering = toPath[l];
|
2073
|
-
entering.locals = toLocals[l];
|
2074
|
-
if (entering.self.onEnter) {
|
2075
|
-
$injector.invoke(entering.self.onEnter, entering.self, entering.locals.globals);
|
2076
|
-
}
|
2077
|
-
}
|
2078
|
-
|
2079
|
-
// Run it again, to catch any transitions in callbacks
|
2080
|
-
if ($state.transition !== transition) return TransitionSuperseded;
|
2081
|
-
|
2082
|
-
// Update globals in $state
|
2083
|
-
$state.$current = to;
|
2084
|
-
$state.current = to.self;
|
2085
|
-
$state.params = toParams;
|
2086
|
-
copy($state.params, $stateParams);
|
2087
|
-
$state.transition = null;
|
2088
|
-
|
2089
|
-
// Update $location
|
2090
|
-
var toNav = to.navigable;
|
2091
|
-
if (options.location && toNav) {
|
2092
|
-
$location.url(toNav.url.format(toNav.locals.globals.$stateParams));
|
2093
|
-
|
2094
|
-
if (options.location === 'replace') {
|
2095
|
-
$location.replace();
|
2096
|
-
}
|
2097
|
-
}
|
2098
|
-
|
2099
|
-
if (options.notify) {
|
2100
|
-
/**
|
2101
|
-
* @ngdoc event
|
2102
|
-
* @name ui.router.state.$state#$stateChangeSuccess
|
2103
|
-
* @eventOf ui.router.state.$state
|
2104
|
-
* @eventType broadcast on root scope
|
2105
|
-
* @description
|
2106
|
-
* Fired once the state transition is **complete**.
|
2107
|
-
*
|
2108
|
-
* @param {Object} event Event object.
|
2109
|
-
* @param {State} toState The state being transitioned to.
|
2110
|
-
* @param {Object} toParams The params supplied to the `toState`.
|
2111
|
-
* @param {State} fromState The current state, pre-transition.
|
2112
|
-
* @param {Object} fromParams The params supplied to the `fromState`.
|
2113
|
-
*/
|
2114
|
-
$rootScope.$broadcast('$stateChangeSuccess', to.self, toParams, from.self, fromParams);
|
2115
|
-
}
|
2116
|
-
currentLocation = $location.url();
|
2117
|
-
|
2118
|
-
return $state.current;
|
2119
|
-
}, function (error) {
|
2120
|
-
if ($state.transition !== transition) return TransitionSuperseded;
|
2121
|
-
|
2122
|
-
$state.transition = null;
|
2123
|
-
/**
|
2124
|
-
* @ngdoc event
|
2125
|
-
* @name ui.router.state.$state#$stateChangeError
|
2126
|
-
* @eventOf ui.router.state.$state
|
2127
|
-
* @eventType broadcast on root scope
|
2128
|
-
* @description
|
2129
|
-
* Fired when an **error occurs** during transition. It's important to note that if you
|
2130
|
-
* have any errors in your resolve functions (javascript errors, non-existent services, etc)
|
2131
|
-
* they will not throw traditionally. You must listen for this $stateChangeError event to
|
2132
|
-
* catch **ALL** errors.
|
2133
|
-
*
|
2134
|
-
* @param {Object} event Event object.
|
2135
|
-
* @param {State} toState The state being transitioned to.
|
2136
|
-
* @param {Object} toParams The params supplied to the `toState`.
|
2137
|
-
* @param {State} fromState The current state, pre-transition.
|
2138
|
-
* @param {Object} fromParams The params supplied to the `fromState`.
|
2139
|
-
* @param {Error} error The resolve error object.
|
2140
|
-
*/
|
2141
|
-
$rootScope.$broadcast('$stateChangeError', to.self, toParams, from.self, fromParams, error);
|
2142
|
-
syncUrl();
|
2143
|
-
|
2144
|
-
return $q.reject(error);
|
2145
|
-
});
|
2146
|
-
|
2147
|
-
return transition;
|
2148
|
-
};
|
2149
|
-
|
2150
|
-
/**
|
2151
|
-
* @ngdoc function
|
2152
|
-
* @name ui.router.state.$state#is
|
2153
|
-
* @methodOf ui.router.state.$state
|
2154
|
-
*
|
2155
|
-
* @description
|
2156
|
-
* Similar to {@link ui.router.state.$state#methods_includes $state.includes},
|
2157
|
-
* but only checks for the full state name. If params is supplied then it will be
|
2158
|
-
* tested for strict equality against the current active params object, so all params
|
2159
|
-
* must match with none missing and no extras.
|
2160
|
-
*
|
2161
|
-
* @example
|
2162
|
-
* <pre>
|
2163
|
-
* $state.is('contact.details.item'); // returns true
|
2164
|
-
* $state.is(contactDetailItemStateObject); // returns true
|
2165
|
-
*
|
2166
|
-
* // everything else would return false
|
2167
|
-
* </pre>
|
2168
|
-
*
|
2169
|
-
* @param {string|object} stateName The state name or state object you'd like to check.
|
2170
|
-
* @param {object=} params A param object, e.g. `{sectionId: section.id}`, that you'd like
|
2171
|
-
* to test against the current active state.
|
2172
|
-
* @returns {boolean} Returns true if it is the state.
|
2173
|
-
*/
|
2174
|
-
$state.is = function is(stateOrName, params) {
|
2175
|
-
var state = findState(stateOrName);
|
2176
|
-
|
2177
|
-
if (!isDefined(state)) {
|
2178
|
-
return undefined;
|
2179
|
-
}
|
2180
|
-
|
2181
|
-
if ($state.$current !== state) {
|
2182
|
-
return false;
|
2183
|
-
}
|
2184
|
-
|
2185
|
-
return isDefined(params) && params !== null ? angular.equals($stateParams, params) : true;
|
2186
|
-
};
|
2187
|
-
|
2188
|
-
/**
|
2189
|
-
* @ngdoc function
|
2190
|
-
* @name ui.router.state.$state#includes
|
2191
|
-
* @methodOf ui.router.state.$state
|
2192
|
-
*
|
2193
|
-
* @description
|
2194
|
-
* A method to determine if the current active state is equal to or is the child of the
|
2195
|
-
* state stateName. If any params are passed then they will be tested for a match as well.
|
2196
|
-
* Not all the parameters need to be passed, just the ones you'd like to test for equality.
|
2197
|
-
*
|
2198
|
-
* @example
|
2199
|
-
* <pre>
|
2200
|
-
* $state.$current.name = 'contacts.details.item';
|
2201
|
-
*
|
2202
|
-
* $state.includes("contacts"); // returns true
|
2203
|
-
* $state.includes("contacts.details"); // returns true
|
2204
|
-
* $state.includes("contacts.details.item"); // returns true
|
2205
|
-
* $state.includes("contacts.list"); // returns false
|
2206
|
-
* $state.includes("about"); // returns false
|
2207
|
-
* </pre>
|
2208
|
-
*
|
2209
|
-
* @description
|
2210
|
-
* Basic globing patterns will also work.
|
2211
|
-
*
|
2212
|
-
* @example
|
2213
|
-
* <pre>
|
2214
|
-
* $state.$current.name = 'contacts.details.item.url';
|
2215
|
-
*
|
2216
|
-
* $state.includes("*.details.*.*"); // returns true
|
2217
|
-
* $state.includes("*.details.**"); // returns true
|
2218
|
-
* $state.includes("**.item.**"); // returns true
|
2219
|
-
* $state.includes("*.details.item.url"); // returns true
|
2220
|
-
* $state.includes("*.details.*.url"); // returns true
|
2221
|
-
* $state.includes("*.details.*"); // returns false
|
2222
|
-
* $state.includes("item.**"); // returns false
|
2223
|
-
* </pre>
|
2224
|
-
*
|
2225
|
-
* @param {string} stateOrName A partial name to be searched for within the current state name.
|
2226
|
-
* @param {object} params A param object, e.g. `{sectionId: section.id}`,
|
2227
|
-
* that you'd like to test against the current active state.
|
2228
|
-
* @returns {boolean} Returns true if it does include the state
|
2229
|
-
*/
|
2230
|
-
|
2231
|
-
$state.includes = function includes(stateOrName, params) {
|
2232
|
-
if (isString(stateOrName) && isGlob(stateOrName)) {
|
2233
|
-
if (doesStateMatchGlob(stateOrName)) {
|
2234
|
-
stateOrName = $state.$current.name;
|
2235
|
-
} else {
|
2236
|
-
return false;
|
2237
|
-
}
|
2238
|
-
}
|
2239
|
-
|
2240
|
-
var state = findState(stateOrName);
|
2241
|
-
if (!isDefined(state)) {
|
2242
|
-
return undefined;
|
2243
|
-
}
|
2244
|
-
|
2245
|
-
if (!isDefined($state.$current.includes[state.name])) {
|
2246
|
-
return false;
|
2247
|
-
}
|
2248
|
-
|
2249
|
-
var validParams = true;
|
2250
|
-
angular.forEach(params, function(value, key) {
|
2251
|
-
if (!isDefined($stateParams[key]) || $stateParams[key] !== value) {
|
2252
|
-
validParams = false;
|
2253
|
-
}
|
2254
|
-
});
|
2255
|
-
return validParams;
|
2256
|
-
};
|
2257
|
-
|
2258
|
-
|
2259
|
-
/**
|
2260
|
-
* @ngdoc function
|
2261
|
-
* @name ui.router.state.$state#href
|
2262
|
-
* @methodOf ui.router.state.$state
|
2263
|
-
*
|
2264
|
-
* @description
|
2265
|
-
* A url generation method that returns the compiled url for the given state populated with the given params.
|
2266
|
-
*
|
2267
|
-
* @example
|
2268
|
-
* <pre>
|
2269
|
-
* expect($state.href("about.person", { person: "bob" })).toEqual("/about/bob");
|
2270
|
-
* </pre>
|
2271
|
-
*
|
2272
|
-
* @param {string|object} stateOrName The state name or state object you'd like to generate a url from.
|
2273
|
-
* @param {object=} params An object of parameter values to fill the state's required parameters.
|
2274
|
-
* @param {object=} options Options object. The options are:
|
2275
|
-
*
|
2276
|
-
* - **`lossy`** - {boolean=true} - If true, and if there is no url associated with the state provided in the
|
2277
|
-
* first parameter, then the constructed href url will be built from the first navigable ancestor (aka
|
2278
|
-
* ancestor with a valid url).
|
2279
|
-
* - **`inherit`** - {boolean=false}, If `true` will inherit url parameters from current url.
|
2280
|
-
* - **`relative`** - {object=$state.$current}, When transitioning with relative path (e.g '^'),
|
2281
|
-
* defines which state to be relative from.
|
2282
|
-
* - **`absolute`** - {boolean=false}, If true will generate an absolute url, e.g. "http://www.example.com/fullurl".
|
2283
|
-
*
|
2284
|
-
* @returns {string} compiled state url
|
2285
|
-
*/
|
2286
|
-
$state.href = function href(stateOrName, params, options) {
|
2287
|
-
options = extend({ lossy: true, inherit: false, absolute: false, relative: $state.$current }, options || {});
|
2288
|
-
var state = findState(stateOrName, options.relative);
|
2289
|
-
if (!isDefined(state)) return null;
|
2290
|
-
|
2291
|
-
params = inheritParams($stateParams, params || {}, $state.$current, state);
|
2292
|
-
var nav = (state && options.lossy) ? state.navigable : state;
|
2293
|
-
var url = (nav && nav.url) ? nav.url.format(normalize(state.params, params || {})) : null;
|
2294
|
-
if (!$locationProvider.html5Mode() && url) {
|
2295
|
-
url = "#" + $locationProvider.hashPrefix() + url;
|
2296
|
-
}
|
2297
|
-
|
2298
|
-
if (baseHref !== '/') {
|
2299
|
-
if ($locationProvider.html5Mode()) {
|
2300
|
-
url = baseHref.slice(0, -1) + url;
|
2301
|
-
} else if (options.absolute){
|
2302
|
-
url = baseHref.slice(1) + url;
|
2303
|
-
}
|
2304
|
-
}
|
2305
|
-
|
2306
|
-
if (options.absolute && url) {
|
2307
|
-
url = $location.protocol() + '://' +
|
2308
|
-
$location.host() +
|
2309
|
-
($location.port() == 80 || $location.port() == 443 ? '' : ':' + $location.port()) +
|
2310
|
-
(!$locationProvider.html5Mode() && url ? '/' : '') +
|
2311
|
-
url;
|
2312
|
-
}
|
2313
|
-
return url;
|
2314
|
-
};
|
2315
|
-
|
2316
|
-
/**
|
2317
|
-
* @ngdoc function
|
2318
|
-
* @name ui.router.state.$state#get
|
2319
|
-
* @methodOf ui.router.state.$state
|
2320
|
-
*
|
2321
|
-
* @description
|
2322
|
-
* Returns the state configuration object for any specific state or all states.
|
2323
|
-
*
|
2324
|
-
* @param {string|object=} stateOrName If provided, will only get the config for
|
2325
|
-
* the requested state. If not provided, returns an array of ALL state configs.
|
2326
|
-
* @returns {object|array} State configuration object or array of all objects.
|
2327
|
-
*/
|
2328
|
-
$state.get = function (stateOrName, context) {
|
2329
|
-
if (!isDefined(stateOrName)) {
|
2330
|
-
var list = [];
|
2331
|
-
forEach(states, function(state) { list.push(state.self); });
|
2332
|
-
return list;
|
2333
|
-
}
|
2334
|
-
var state = findState(stateOrName, context);
|
2335
|
-
return (state && state.self) ? state.self : null;
|
2336
|
-
};
|
2337
|
-
|
2338
|
-
function resolveState(state, params, paramsAreFiltered, inherited, dst) {
|
2339
|
-
// Make a restricted $stateParams with only the parameters that apply to this state if
|
2340
|
-
// necessary. In addition to being available to the controller and onEnter/onExit callbacks,
|
2341
|
-
// we also need $stateParams to be available for any $injector calls we make during the
|
2342
|
-
// dependency resolution process.
|
2343
|
-
var $stateParams = (paramsAreFiltered) ? params : filterByKeys(state.params, params);
|
2344
|
-
var locals = { $stateParams: $stateParams };
|
2345
|
-
|
2346
|
-
// Resolve 'global' dependencies for the state, i.e. those not specific to a view.
|
2347
|
-
// We're also including $stateParams in this; that way the parameters are restricted
|
2348
|
-
// to the set that should be visible to the state, and are independent of when we update
|
2349
|
-
// the global $state and $stateParams values.
|
2350
|
-
dst.resolve = $resolve.resolve(state.resolve, locals, dst.resolve, state);
|
2351
|
-
var promises = [ dst.resolve.then(function (globals) {
|
2352
|
-
dst.globals = globals;
|
2353
|
-
}) ];
|
2354
|
-
if (inherited) promises.push(inherited);
|
2355
|
-
|
2356
|
-
// Resolve template and dependencies for all views.
|
2357
|
-
forEach(state.views, function (view, name) {
|
2358
|
-
var injectables = (view.resolve && view.resolve !== state.resolve ? view.resolve : {});
|
2359
|
-
injectables.$template = [ function () {
|
2360
|
-
return $view.load(name, { view: view, locals: locals, params: $stateParams, notify: false }) || '';
|
2361
|
-
}];
|
2362
|
-
|
2363
|
-
promises.push($resolve.resolve(injectables, locals, dst.resolve, state).then(function (result) {
|
2364
|
-
// References to the controller (only instantiated at link time)
|
2365
|
-
if (isFunction(view.controllerProvider) || isArray(view.controllerProvider)) {
|
2366
|
-
var injectLocals = angular.extend({}, injectables, locals);
|
2367
|
-
result.$$controller = $injector.invoke(view.controllerProvider, null, injectLocals);
|
2368
|
-
} else {
|
2369
|
-
result.$$controller = view.controller;
|
2370
|
-
}
|
2371
|
-
// Provide access to the state itself for internal use
|
2372
|
-
result.$$state = state;
|
2373
|
-
result.$$controllerAs = view.controllerAs;
|
2374
|
-
dst[name] = result;
|
2375
|
-
}));
|
2376
|
-
});
|
2377
|
-
|
2378
|
-
// Wait for all the promises and then return the activation object
|
2379
|
-
return $q.all(promises).then(function (values) {
|
2380
|
-
return dst;
|
2381
|
-
});
|
2382
|
-
}
|
2383
|
-
|
2384
|
-
return $state;
|
2385
|
-
}
|
2386
|
-
|
2387
|
-
function shouldTriggerReload(to, from, locals, options) {
|
2388
|
-
if ( to === from && ((locals === from.locals && !options.reload) || (to.self.reloadOnSearch === false)) ) {
|
2389
|
-
return true;
|
2390
|
-
}
|
2391
|
-
}
|
2392
|
-
}
|
2393
|
-
|
2394
|
-
angular.module('ui.router.state')
|
2395
|
-
.value('$stateParams', {})
|
2396
|
-
.provider('$state', $StateProvider);
|
2397
|
-
|
2398
|
-
|
2399
|
-
$ViewProvider.$inject = [];
|
2400
|
-
function $ViewProvider() {
|
2401
|
-
|
2402
|
-
this.$get = $get;
|
2403
|
-
/**
|
2404
|
-
* @ngdoc object
|
2405
|
-
* @name ui.router.state.$view
|
2406
|
-
*
|
2407
|
-
* @requires ui.router.util.$templateFactory
|
2408
|
-
* @requires $rootScope
|
2409
|
-
*
|
2410
|
-
* @description
|
2411
|
-
*
|
2412
|
-
*/
|
2413
|
-
$get.$inject = ['$rootScope', '$templateFactory'];
|
2414
|
-
function $get( $rootScope, $templateFactory) {
|
2415
|
-
return {
|
2416
|
-
// $view.load('full.viewName', { template: ..., controller: ..., resolve: ..., async: false, params: ... })
|
2417
|
-
/**
|
2418
|
-
* @ngdoc function
|
2419
|
-
* @name ui.router.state.$view#load
|
2420
|
-
* @methodOf ui.router.state.$view
|
2421
|
-
*
|
2422
|
-
* @description
|
2423
|
-
*
|
2424
|
-
* @param {string} name name
|
2425
|
-
* @param {object} options option object.
|
2426
|
-
*/
|
2427
|
-
load: function load(name, options) {
|
2428
|
-
var result, defaults = {
|
2429
|
-
template: null, controller: null, view: null, locals: null, notify: true, async: true, params: {}
|
2430
|
-
};
|
2431
|
-
options = extend(defaults, options);
|
2432
|
-
|
2433
|
-
if (options.view) {
|
2434
|
-
result = $templateFactory.fromConfig(options.view, options.params, options.locals);
|
2435
|
-
}
|
2436
|
-
if (result && options.notify) {
|
2437
|
-
/**
|
2438
|
-
* @ngdoc event
|
2439
|
-
* @name ui.router.state.$state#$viewContentLoading
|
2440
|
-
* @eventOf ui.router.state.$view
|
2441
|
-
* @eventType broadcast on root scope
|
2442
|
-
* @description
|
2443
|
-
*
|
2444
|
-
* Fired once the view **begins loading**, *before* the DOM is rendered.
|
2445
|
-
*
|
2446
|
-
* @param {Object} event Event object.
|
2447
|
-
* @param {Object} viewConfig The view config properties (template, controller, etc).
|
2448
|
-
*
|
2449
|
-
* @example
|
2450
|
-
*
|
2451
|
-
* <pre>
|
2452
|
-
* $scope.$on('$viewContentLoading',
|
2453
|
-
* function(event, viewConfig){
|
2454
|
-
* // Access to all the view config properties.
|
2455
|
-
* // and one special property 'targetView'
|
2456
|
-
* // viewConfig.targetView
|
2457
|
-
* });
|
2458
|
-
* </pre>
|
2459
|
-
*/
|
2460
|
-
$rootScope.$broadcast('$viewContentLoading', options);
|
2461
|
-
}
|
2462
|
-
return result;
|
2463
|
-
}
|
2464
|
-
};
|
2465
|
-
}
|
2466
|
-
}
|
2467
|
-
|
2468
|
-
angular.module('ui.router.state').provider('$view', $ViewProvider);
|
2469
|
-
|
2470
|
-
/**
|
2471
|
-
* @ngdoc object
|
2472
|
-
* @name ui.router.state.$uiViewScrollProvider
|
2473
|
-
*
|
2474
|
-
* @description
|
2475
|
-
* Provider that returns the {@link ui.router.state.$uiViewScroll} service function.
|
2476
|
-
*/
|
2477
|
-
function $ViewScrollProvider() {
|
2478
|
-
|
2479
|
-
var useAnchorScroll = false;
|
2480
|
-
|
2481
|
-
/**
|
2482
|
-
* @ngdoc function
|
2483
|
-
* @name ui.router.state.$uiViewScrollProvider#useAnchorScroll
|
2484
|
-
* @methodOf ui.router.state.$uiViewScrollProvider
|
2485
|
-
*
|
2486
|
-
* @description
|
2487
|
-
* Reverts back to using the core [`$anchorScroll`](http://docs.angularjs.org/api/ng.$anchorScroll) service for
|
2488
|
-
* scrolling based on the url anchor.
|
2489
|
-
*/
|
2490
|
-
this.useAnchorScroll = function () {
|
2491
|
-
useAnchorScroll = true;
|
2492
|
-
};
|
2493
|
-
|
2494
|
-
/**
|
2495
|
-
* @ngdoc object
|
2496
|
-
* @name ui.router.state.$uiViewScroll
|
2497
|
-
*
|
2498
|
-
* @requires $anchorScroll
|
2499
|
-
* @requires $timeout
|
2500
|
-
*
|
2501
|
-
* @description
|
2502
|
-
* When called with a jqLite element, it scrolls the element into view (after a
|
2503
|
-
* `$timeout` so the DOM has time to refresh).
|
2504
|
-
*
|
2505
|
-
* If you prefer to rely on `$anchorScroll` to scroll the view to the anchor,
|
2506
|
-
* this can be enabled by calling {@link ui.router.state.$uiViewScrollProvider#methods_useAnchorScroll `$uiViewScrollProvider.useAnchorScroll()`}.
|
2507
|
-
*/
|
2508
|
-
this.$get = ['$anchorScroll', '$timeout', function ($anchorScroll, $timeout) {
|
2509
|
-
if (useAnchorScroll) {
|
2510
|
-
return $anchorScroll;
|
2511
|
-
}
|
2512
|
-
|
2513
|
-
return function ($element) {
|
2514
|
-
$timeout(function () {
|
2515
|
-
$element[0].scrollIntoView();
|
2516
|
-
}, 0, false);
|
2517
|
-
};
|
2518
|
-
}];
|
2519
|
-
}
|
2520
|
-
|
2521
|
-
angular.module('ui.router.state').provider('$uiViewScroll', $ViewScrollProvider);
|
2522
|
-
|
2523
|
-
/**
|
2524
|
-
* @ngdoc directive
|
2525
|
-
* @name ui.router.state.directive:ui-view
|
2526
|
-
*
|
2527
|
-
* @requires ui.router.state.$state
|
2528
|
-
* @requires $compile
|
2529
|
-
* @requires $controller
|
2530
|
-
* @requires $injector
|
2531
|
-
* @requires ui.router.state.$uiViewScroll
|
2532
|
-
* @requires $document
|
2533
|
-
*
|
2534
|
-
* @restrict ECA
|
2535
|
-
*
|
2536
|
-
* @description
|
2537
|
-
* The ui-view directive tells $state where to place your templates.
|
2538
|
-
*
|
2539
|
-
* @param {string=} ui-view A view name. The name should be unique amongst the other views in the
|
2540
|
-
* same state. You can have views of the same name that live in different states.
|
2541
|
-
*
|
2542
|
-
* @param {string=} autoscroll It allows you to set the scroll behavior of the browser window
|
2543
|
-
* when a view is populated. By default, $anchorScroll is overridden by ui-router's custom scroll
|
2544
|
-
* service, {@link ui.router.state.$uiViewScroll}. This custom service let's you
|
2545
|
-
* scroll ui-view elements into view when they are populated during a state activation.
|
2546
|
-
*
|
2547
|
-
* *Note: To revert back to old [`$anchorScroll`](http://docs.angularjs.org/api/ng.$anchorScroll)
|
2548
|
-
* functionality, call `$uiViewScrollProvider.useAnchorScroll()`.*
|
2549
|
-
*
|
2550
|
-
* @param {string=} onload Expression to evaluate whenever the view updates.
|
2551
|
-
*
|
2552
|
-
* @example
|
2553
|
-
* A view can be unnamed or named.
|
2554
|
-
* <pre>
|
2555
|
-
* <!-- Unnamed -->
|
2556
|
-
* <div ui-view></div>
|
2557
|
-
*
|
2558
|
-
* <!-- Named -->
|
2559
|
-
* <div ui-view="viewName"></div>
|
2560
|
-
* </pre>
|
2561
|
-
*
|
2562
|
-
* You can only have one unnamed view within any template (or root html). If you are only using a
|
2563
|
-
* single view and it is unnamed then you can populate it like so:
|
2564
|
-
* <pre>
|
2565
|
-
* <div ui-view></div>
|
2566
|
-
* $stateProvider.state("home", {
|
2567
|
-
* template: "<h1>HELLO!</h1>"
|
2568
|
-
* })
|
2569
|
-
* </pre>
|
2570
|
-
*
|
2571
|
-
* The above is a convenient shortcut equivalent to specifying your view explicitly with the {@link ui.router.state.$stateProvider#views `views`}
|
2572
|
-
* config property, by name, in this case an empty name:
|
2573
|
-
* <pre>
|
2574
|
-
* $stateProvider.state("home", {
|
2575
|
-
* views: {
|
2576
|
-
* "": {
|
2577
|
-
* template: "<h1>HELLO!</h1>"
|
2578
|
-
* }
|
2579
|
-
* }
|
2580
|
-
* })
|
2581
|
-
* </pre>
|
2582
|
-
*
|
2583
|
-
* But typically you'll only use the views property if you name your view or have more than one view
|
2584
|
-
* in the same template. There's not really a compelling reason to name a view if its the only one,
|
2585
|
-
* but you could if you wanted, like so:
|
2586
|
-
* <pre>
|
2587
|
-
* <div ui-view="main"></div>
|
2588
|
-
* </pre>
|
2589
|
-
* <pre>
|
2590
|
-
* $stateProvider.state("home", {
|
2591
|
-
* views: {
|
2592
|
-
* "main": {
|
2593
|
-
* template: "<h1>HELLO!</h1>"
|
2594
|
-
* }
|
2595
|
-
* }
|
2596
|
-
* })
|
2597
|
-
* </pre>
|
2598
|
-
*
|
2599
|
-
* Really though, you'll use views to set up multiple views:
|
2600
|
-
* <pre>
|
2601
|
-
* <div ui-view></div>
|
2602
|
-
* <div ui-view="chart"></div>
|
2603
|
-
* <div ui-view="data"></div>
|
2604
|
-
* </pre>
|
2605
|
-
*
|
2606
|
-
* <pre>
|
2607
|
-
* $stateProvider.state("home", {
|
2608
|
-
* views: {
|
2609
|
-
* "": {
|
2610
|
-
* template: "<h1>HELLO!</h1>"
|
2611
|
-
* },
|
2612
|
-
* "chart": {
|
2613
|
-
* template: "<chart_thing/>"
|
2614
|
-
* },
|
2615
|
-
* "data": {
|
2616
|
-
* template: "<data_thing/>"
|
2617
|
-
* }
|
2618
|
-
* }
|
2619
|
-
* })
|
2620
|
-
* </pre>
|
2621
|
-
*
|
2622
|
-
* Examples for `autoscroll`:
|
2623
|
-
*
|
2624
|
-
* <pre>
|
2625
|
-
* <!-- If autoscroll present with no expression,
|
2626
|
-
* then scroll ui-view into view -->
|
2627
|
-
* <ui-view autoscroll/>
|
2628
|
-
*
|
2629
|
-
* <!-- If autoscroll present with valid expression,
|
2630
|
-
* then scroll ui-view into view if expression evaluates to true -->
|
2631
|
-
* <ui-view autoscroll='true'/>
|
2632
|
-
* <ui-view autoscroll='false'/>
|
2633
|
-
* <ui-view autoscroll='scopeVariable'/>
|
2634
|
-
* </pre>
|
2635
|
-
*/
|
2636
|
-
$ViewDirective.$inject = ['$state', '$injector', '$uiViewScroll'];
|
2637
|
-
function $ViewDirective( $state, $injector, $uiViewScroll) {
|
2638
|
-
|
2639
|
-
function getService() {
|
2640
|
-
return ($injector.has) ? function(service) {
|
2641
|
-
return $injector.has(service) ? $injector.get(service) : null;
|
2642
|
-
} : function(service) {
|
2643
|
-
try {
|
2644
|
-
return $injector.get(service);
|
2645
|
-
} catch (e) {
|
2646
|
-
return null;
|
2647
|
-
}
|
2648
|
-
};
|
2649
|
-
}
|
2650
|
-
|
2651
|
-
var service = getService(),
|
2652
|
-
$animator = service('$animator'),
|
2653
|
-
$animate = service('$animate');
|
2654
|
-
|
2655
|
-
// Returns a set of DOM manipulation functions based on which Angular version
|
2656
|
-
// it should use
|
2657
|
-
function getRenderer(attrs, scope) {
|
2658
|
-
var statics = function() {
|
2659
|
-
return {
|
2660
|
-
enter: function (element, target, cb) { target.after(element); cb(); },
|
2661
|
-
leave: function (element, cb) { element.remove(); cb(); }
|
2662
|
-
};
|
2663
|
-
};
|
2664
|
-
|
2665
|
-
if ($animate) {
|
2666
|
-
return {
|
2667
|
-
enter: function(element, target, cb) { $animate.enter(element, null, target, cb); },
|
2668
|
-
leave: function(element, cb) { $animate.leave(element, cb); }
|
2669
|
-
};
|
2670
|
-
}
|
2671
|
-
|
2672
|
-
if ($animator) {
|
2673
|
-
var animate = $animator && $animator(scope, attrs);
|
2674
|
-
|
2675
|
-
return {
|
2676
|
-
enter: function(element, target, cb) {animate.enter(element, null, target); cb(); },
|
2677
|
-
leave: function(element, cb) { animate.leave(element); cb(); }
|
2678
|
-
};
|
2679
|
-
}
|
2680
|
-
|
2681
|
-
return statics();
|
2682
|
-
}
|
2683
|
-
|
2684
|
-
var directive = {
|
2685
|
-
restrict: 'ECA',
|
2686
|
-
terminal: true,
|
2687
|
-
priority: 400,
|
2688
|
-
transclude: 'element',
|
2689
|
-
compile: function (tElement, tAttrs, $transclude) {
|
2690
|
-
return function (scope, $element, attrs) {
|
2691
|
-
var previousEl, currentEl, currentScope, latestLocals,
|
2692
|
-
onloadExp = attrs.onload || '',
|
2693
|
-
autoScrollExp = attrs.autoscroll,
|
2694
|
-
renderer = getRenderer(attrs, scope);
|
2695
|
-
|
2696
|
-
scope.$on('$stateChangeSuccess', function() {
|
2697
|
-
updateView(false);
|
2698
|
-
});
|
2699
|
-
scope.$on('$viewContentLoading', function() {
|
2700
|
-
updateView(false);
|
2701
|
-
});
|
2702
|
-
|
2703
|
-
updateView(true);
|
2704
|
-
|
2705
|
-
function cleanupLastView() {
|
2706
|
-
if (previousEl) {
|
2707
|
-
previousEl.remove();
|
2708
|
-
previousEl = null;
|
2709
|
-
}
|
2710
|
-
|
2711
|
-
if (currentScope) {
|
2712
|
-
currentScope.$destroy();
|
2713
|
-
currentScope = null;
|
2714
|
-
}
|
2715
|
-
|
2716
|
-
if (currentEl) {
|
2717
|
-
renderer.leave(currentEl, function() {
|
2718
|
-
previousEl = null;
|
2719
|
-
});
|
2720
|
-
|
2721
|
-
previousEl = currentEl;
|
2722
|
-
currentEl = null;
|
2723
|
-
}
|
2724
|
-
}
|
2725
|
-
|
2726
|
-
function updateView(firstTime) {
|
2727
|
-
var newScope = scope.$new(),
|
2728
|
-
name = currentEl && currentEl.data('$uiViewName'),
|
2729
|
-
previousLocals = name && $state.$current && $state.$current.locals[name];
|
2730
|
-
|
2731
|
-
if (!firstTime && previousLocals === latestLocals) return; // nothing to do
|
2732
|
-
|
2733
|
-
var clone = $transclude(newScope, function(clone) {
|
2734
|
-
renderer.enter(clone, $element, function onUiViewEnter() {
|
2735
|
-
if (angular.isDefined(autoScrollExp) && !autoScrollExp || scope.$eval(autoScrollExp)) {
|
2736
|
-
$uiViewScroll(clone);
|
2737
|
-
}
|
2738
|
-
});
|
2739
|
-
cleanupLastView();
|
2740
|
-
});
|
2741
|
-
|
2742
|
-
latestLocals = $state.$current.locals[clone.data('$uiViewName')];
|
2743
|
-
|
2744
|
-
currentEl = clone;
|
2745
|
-
currentScope = newScope;
|
2746
|
-
/**
|
2747
|
-
* @ngdoc event
|
2748
|
-
* @name ui.router.state.directive:ui-view#$viewContentLoaded
|
2749
|
-
* @eventOf ui.router.state.directive:ui-view
|
2750
|
-
* @eventType emits on ui-view directive scope
|
2751
|
-
* @description *
|
2752
|
-
* Fired once the view is **loaded**, *after* the DOM is rendered.
|
2753
|
-
*
|
2754
|
-
* @param {Object} event Event object.
|
2755
|
-
*/
|
2756
|
-
currentScope.$emit('$viewContentLoaded');
|
2757
|
-
currentScope.$eval(onloadExp);
|
2758
|
-
}
|
2759
|
-
};
|
2760
|
-
}
|
2761
|
-
};
|
2762
|
-
|
2763
|
-
return directive;
|
2764
|
-
}
|
2765
|
-
|
2766
|
-
$ViewDirectiveFill.$inject = ['$compile', '$controller', '$state'];
|
2767
|
-
function $ViewDirectiveFill ($compile, $controller, $state) {
|
2768
|
-
return {
|
2769
|
-
restrict: 'ECA',
|
2770
|
-
priority: -400,
|
2771
|
-
compile: function (tElement) {
|
2772
|
-
var initial = tElement.html();
|
2773
|
-
return function (scope, $element, attrs) {
|
2774
|
-
var name = attrs.uiView || attrs.name || '',
|
2775
|
-
inherited = $element.inheritedData('$uiView');
|
2776
|
-
|
2777
|
-
if (name.indexOf('@') < 0) {
|
2778
|
-
name = name + '@' + (inherited ? inherited.state.name : '');
|
2779
|
-
}
|
2780
|
-
|
2781
|
-
$element.data('$uiViewName', name);
|
2782
|
-
|
2783
|
-
var current = $state.$current,
|
2784
|
-
locals = current && current.locals[name];
|
2785
|
-
|
2786
|
-
if (! locals) {
|
2787
|
-
return;
|
2788
|
-
}
|
2789
|
-
|
2790
|
-
$element.data('$uiView', { name: name, state: locals.$$state });
|
2791
|
-
$element.html(locals.$template ? locals.$template : initial);
|
2792
|
-
|
2793
|
-
var link = $compile($element.contents());
|
2794
|
-
|
2795
|
-
if (locals.$$controller) {
|
2796
|
-
locals.$scope = scope;
|
2797
|
-
var controller = $controller(locals.$$controller, locals);
|
2798
|
-
if (locals.$$controllerAs) {
|
2799
|
-
scope[locals.$$controllerAs] = controller;
|
2800
|
-
}
|
2801
|
-
$element.data('$ngControllerController', controller);
|
2802
|
-
$element.children().data('$ngControllerController', controller);
|
2803
|
-
}
|
2804
|
-
|
2805
|
-
link(scope);
|
2806
|
-
};
|
2807
|
-
}
|
2808
|
-
};
|
2809
|
-
}
|
2810
|
-
|
2811
|
-
angular.module('ui.router.state').directive('uiView', $ViewDirective);
|
2812
|
-
angular.module('ui.router.state').directive('uiView', $ViewDirectiveFill);
|
2813
|
-
|
2814
|
-
function parseStateRef(ref) {
|
2815
|
-
var parsed = ref.replace(/\n/g, " ").match(/^([^(]+?)\s*(\((.*)\))?$/);
|
2816
|
-
if (!parsed || parsed.length !== 4) throw new Error("Invalid state ref '" + ref + "'");
|
2817
|
-
return { state: parsed[1], paramExpr: parsed[3] || null };
|
2818
|
-
}
|
2819
|
-
|
2820
|
-
function stateContext(el) {
|
2821
|
-
var stateData = el.parent().inheritedData('$uiView');
|
2822
|
-
|
2823
|
-
if (stateData && stateData.state && stateData.state.name) {
|
2824
|
-
return stateData.state;
|
2825
|
-
}
|
2826
|
-
}
|
2827
|
-
|
2828
|
-
/**
|
2829
|
-
* @ngdoc directive
|
2830
|
-
* @name ui.router.state.directive:ui-sref
|
2831
|
-
*
|
2832
|
-
* @requires ui.router.state.$state
|
2833
|
-
* @requires $timeout
|
2834
|
-
*
|
2835
|
-
* @restrict A
|
2836
|
-
*
|
2837
|
-
* @description
|
2838
|
-
* A directive that binds a link (`<a>` tag) to a state. If the state has an associated
|
2839
|
-
* URL, the directive will automatically generate & update the `href` attribute via
|
2840
|
-
* the {@link ui.router.state.$state#methods_href $state.href()} method. Clicking
|
2841
|
-
* the link will trigger a state transition with optional parameters.
|
2842
|
-
*
|
2843
|
-
* Also middle-clicking, right-clicking, and ctrl-clicking on the link will be
|
2844
|
-
* handled natively by the browser.
|
2845
|
-
*
|
2846
|
-
* You can also use relative state paths within ui-sref, just like the relative
|
2847
|
-
* paths passed to `$state.go()`. You just need to be aware that the path is relative
|
2848
|
-
* to the state that the link lives in, in other words the state that loaded the
|
2849
|
-
* template containing the link.
|
2850
|
-
*
|
2851
|
-
* You can specify options to pass to {@link ui.router.state.$state#go $state.go()}
|
2852
|
-
* using the `ui-sref-opts` attribute. Options are restricted to `location`, `inherit`,
|
2853
|
-
* and `reload`.
|
2854
|
-
*
|
2855
|
-
* @example
|
2856
|
-
* Here's an example of how you'd use ui-sref and how it would compile. If you have the
|
2857
|
-
* following template:
|
2858
|
-
* <pre>
|
2859
|
-
* <a ui-sref="home">Home</a> | <a ui-sref="about">About</a>
|
2860
|
-
*
|
2861
|
-
* <ul>
|
2862
|
-
* <li ng-repeat="contact in contacts">
|
2863
|
-
* <a ui-sref="contacts.detail({ id: contact.id })">{{ contact.name }}</a>
|
2864
|
-
* </li>
|
2865
|
-
* </ul>
|
2866
|
-
* </pre>
|
2867
|
-
*
|
2868
|
-
* Then the compiled html would be (assuming Html5Mode is off):
|
2869
|
-
* <pre>
|
2870
|
-
* <a href="#/home" ui-sref="home">Home</a> | <a href="#/about" ui-sref="about">About</a>
|
2871
|
-
*
|
2872
|
-
* <ul>
|
2873
|
-
* <li ng-repeat="contact in contacts">
|
2874
|
-
* <a href="#/contacts/1" ui-sref="contacts.detail({ id: contact.id })">Joe</a>
|
2875
|
-
* </li>
|
2876
|
-
* <li ng-repeat="contact in contacts">
|
2877
|
-
* <a href="#/contacts/2" ui-sref="contacts.detail({ id: contact.id })">Alice</a>
|
2878
|
-
* </li>
|
2879
|
-
* <li ng-repeat="contact in contacts">
|
2880
|
-
* <a href="#/contacts/3" ui-sref="contacts.detail({ id: contact.id })">Bob</a>
|
2881
|
-
* </li>
|
2882
|
-
* </ul>
|
2883
|
-
*
|
2884
|
-
* <a ui-sref="home" ui-sref-opts="{reload: true}">Home</a>
|
2885
|
-
* </pre>
|
2886
|
-
*
|
2887
|
-
* @param {string} ui-sref 'stateName' can be any valid absolute or relative state
|
2888
|
-
* @param {Object} ui-sref-opts options to pass to {@link ui.router.state.$state#go $state.go()}
|
2889
|
-
*/
|
2890
|
-
$StateRefDirective.$inject = ['$state', '$timeout'];
|
2891
|
-
function $StateRefDirective($state, $timeout) {
|
2892
|
-
var allowedOptions = ['location', 'inherit', 'reload'];
|
2893
|
-
|
2894
|
-
return {
|
2895
|
-
restrict: 'A',
|
2896
|
-
require: '?^uiSrefActive',
|
2897
|
-
link: function(scope, element, attrs, uiSrefActive) {
|
2898
|
-
var ref = parseStateRef(attrs.uiSref);
|
2899
|
-
var params = null, url = null, base = stateContext(element) || $state.$current;
|
2900
|
-
var isForm = element[0].nodeName === "FORM";
|
2901
|
-
var attr = isForm ? "action" : "href", nav = true;
|
2902
|
-
|
2903
|
-
var options = {
|
2904
|
-
relative: base
|
2905
|
-
};
|
2906
|
-
var optionsOverride = scope.$eval(attrs.uiSrefOpts) || {};
|
2907
|
-
angular.forEach(allowedOptions, function(option) {
|
2908
|
-
if (option in optionsOverride) {
|
2909
|
-
options[option] = optionsOverride[option];
|
2910
|
-
}
|
2911
|
-
});
|
2912
|
-
|
2913
|
-
var update = function(newVal) {
|
2914
|
-
if (newVal) params = newVal;
|
2915
|
-
if (!nav) return;
|
2916
|
-
|
2917
|
-
var newHref = $state.href(ref.state, params, options);
|
2918
|
-
|
2919
|
-
if (uiSrefActive) {
|
2920
|
-
uiSrefActive.$$setStateInfo(ref.state, params);
|
2921
|
-
}
|
2922
|
-
if (!newHref) {
|
2923
|
-
nav = false;
|
2924
|
-
return false;
|
2925
|
-
}
|
2926
|
-
element[0][attr] = newHref;
|
2927
|
-
};
|
2928
|
-
|
2929
|
-
if (ref.paramExpr) {
|
2930
|
-
scope.$watch(ref.paramExpr, function(newVal, oldVal) {
|
2931
|
-
if (newVal !== params) update(newVal);
|
2932
|
-
}, true);
|
2933
|
-
params = scope.$eval(ref.paramExpr);
|
2934
|
-
}
|
2935
|
-
update();
|
2936
|
-
|
2937
|
-
if (isForm) return;
|
2938
|
-
|
2939
|
-
element.bind("click", function(e) {
|
2940
|
-
var button = e.which || e.button;
|
2941
|
-
if ( !(button > 1 || e.ctrlKey || e.metaKey || e.shiftKey || element.attr('target')) ) {
|
2942
|
-
// HACK: This is to allow ng-clicks to be processed before the transition is initiated:
|
2943
|
-
$timeout(function() {
|
2944
|
-
$state.go(ref.state, params, options);
|
2945
|
-
});
|
2946
|
-
e.preventDefault();
|
2947
|
-
}
|
2948
|
-
});
|
2949
|
-
}
|
2950
|
-
};
|
2951
|
-
}
|
2952
|
-
|
2953
|
-
/**
|
2954
|
-
* @ngdoc directive
|
2955
|
-
* @name ui.router.state.directive:ui-sref-active
|
2956
|
-
*
|
2957
|
-
* @requires ui.router.state.$state
|
2958
|
-
* @requires ui.router.state.$stateParams
|
2959
|
-
* @requires $interpolate
|
2960
|
-
*
|
2961
|
-
* @restrict A
|
2962
|
-
*
|
2963
|
-
* @description
|
2964
|
-
* A directive working alongside ui-sref to add classes to an element when the
|
2965
|
-
* related ui-sref directive's state is active, and removing them when it is inactive.
|
2966
|
-
* The primary use-case is to simplify the special appearance of navigation menus
|
2967
|
-
* relying on `ui-sref`, by having the "active" state's menu button appear different,
|
2968
|
-
* distinguishing it from the inactive menu items.
|
2969
|
-
*
|
2970
|
-
* @example
|
2971
|
-
* Given the following template:
|
2972
|
-
* <pre>
|
2973
|
-
* <ul>
|
2974
|
-
* <li ui-sref-active="active" class="item">
|
2975
|
-
* <a href ui-sref="app.user({user: 'bilbobaggins'})">@bilbobaggins</a>
|
2976
|
-
* </li>
|
2977
|
-
* </ul>
|
2978
|
-
* </pre>
|
2979
|
-
*
|
2980
|
-
* When the app state is "app.user", and contains the state parameter "user" with value "bilbobaggins",
|
2981
|
-
* the resulting HTML will appear as (note the 'active' class):
|
2982
|
-
* <pre>
|
2983
|
-
* <ul>
|
2984
|
-
* <li ui-sref-active="active" class="item active">
|
2985
|
-
* <a ui-sref="app.user({user: 'bilbobaggins'})" href="/users/bilbobaggins">@bilbobaggins</a>
|
2986
|
-
* </li>
|
2987
|
-
* </ul>
|
2988
|
-
* </pre>
|
2989
|
-
*
|
2990
|
-
* The class name is interpolated **once** during the directives link time (any further changes to the
|
2991
|
-
* interpolated value are ignored).
|
2992
|
-
*
|
2993
|
-
* Multiple classes may be specified in a space-separated format:
|
2994
|
-
* <pre>
|
2995
|
-
* <ul>
|
2996
|
-
* <li ui-sref-active='class1 class2 class3'>
|
2997
|
-
* <a ui-sref="app.user">link</a>
|
2998
|
-
* </li>
|
2999
|
-
* </ul>
|
3000
|
-
* </pre>
|
3001
|
-
*/
|
3002
|
-
$StateActiveDirective.$inject = ['$state', '$stateParams', '$interpolate'];
|
3003
|
-
function $StateActiveDirective($state, $stateParams, $interpolate) {
|
3004
|
-
return {
|
3005
|
-
restrict: "A",
|
3006
|
-
controller: ['$scope', '$element', '$attrs', function($scope, $element, $attrs) {
|
3007
|
-
var state, params, activeClass;
|
3008
|
-
|
3009
|
-
// There probably isn't much point in $observing this
|
3010
|
-
activeClass = $interpolate($attrs.uiSrefActive || '', false)($scope);
|
3011
|
-
|
3012
|
-
// Allow uiSref to communicate with uiSrefActive
|
3013
|
-
this.$$setStateInfo = function(newState, newParams) {
|
3014
|
-
state = $state.get(newState, stateContext($element));
|
3015
|
-
params = newParams;
|
3016
|
-
update();
|
3017
|
-
};
|
3018
|
-
|
3019
|
-
$scope.$on('$stateChangeSuccess', update);
|
3020
|
-
|
3021
|
-
// Update route state
|
3022
|
-
function update() {
|
3023
|
-
if ($state.$current.self === state && matchesParams()) {
|
3024
|
-
$element.addClass(activeClass);
|
3025
|
-
} else {
|
3026
|
-
$element.removeClass(activeClass);
|
3027
|
-
}
|
3028
|
-
}
|
3029
|
-
|
3030
|
-
function matchesParams() {
|
3031
|
-
return !params || equalForKeys(params, $stateParams);
|
3032
|
-
}
|
3033
|
-
}]
|
3034
|
-
};
|
3035
|
-
}
|
3036
|
-
|
3037
|
-
angular.module('ui.router.state')
|
3038
|
-
.directive('uiSref', $StateRefDirective)
|
3039
|
-
.directive('uiSrefActive', $StateActiveDirective);
|
3040
|
-
|
3041
|
-
/**
|
3042
|
-
* @ngdoc filter
|
3043
|
-
* @name ui.router.state.filter:isState
|
3044
|
-
*
|
3045
|
-
* @requires ui.router.state.$state
|
3046
|
-
*
|
3047
|
-
* @description
|
3048
|
-
* Translates to {@link ui.router.state.$state#methods_is $state.is("stateName")}.
|
3049
|
-
*/
|
3050
|
-
$IsStateFilter.$inject = ['$state'];
|
3051
|
-
function $IsStateFilter($state) {
|
3052
|
-
return function(state) {
|
3053
|
-
return $state.is(state);
|
3054
|
-
};
|
3055
|
-
}
|
3056
|
-
|
3057
|
-
/**
|
3058
|
-
* @ngdoc filter
|
3059
|
-
* @name ui.router.state.filter:includedByState
|
3060
|
-
*
|
3061
|
-
* @requires ui.router.state.$state
|
3062
|
-
*
|
3063
|
-
* @description
|
3064
|
-
* Translates to {@link ui.router.state.$state#methods_includes $state.includes('fullOrPartialStateName')}.
|
3065
|
-
*/
|
3066
|
-
$IncludedByStateFilter.$inject = ['$state'];
|
3067
|
-
function $IncludedByStateFilter($state) {
|
3068
|
-
return function(state) {
|
3069
|
-
return $state.includes(state);
|
3070
|
-
};
|
3071
|
-
}
|
3072
|
-
|
3073
|
-
angular.module('ui.router.state')
|
3074
|
-
.filter('isState', $IsStateFilter)
|
3075
|
-
.filter('includedByState', $IncludedByStateFilter);
|
3076
|
-
|
3077
|
-
/*
|
3078
|
-
* @ngdoc object
|
3079
|
-
* @name ui.router.compat.$routeProvider
|
3080
|
-
*
|
3081
|
-
* @requires ui.router.state.$stateProvider
|
3082
|
-
* @requires ui.router.router.$urlRouterProvider
|
3083
|
-
*
|
3084
|
-
* @description
|
3085
|
-
* `$routeProvider` of the `ui.router.compat` module overwrites the existing
|
3086
|
-
* `routeProvider` from the core. This is done to provide compatibility between
|
3087
|
-
* the UI Router and the core router.
|
3088
|
-
*
|
3089
|
-
* It also provides a `when()` method to register routes that map to certain urls.
|
3090
|
-
* Behind the scenes it actually delegates either to
|
3091
|
-
* {@link ui.router.router.$urlRouterProvider $urlRouterProvider} or to the
|
3092
|
-
* {@link ui.router.state.$stateProvider $stateProvider} to postprocess the given
|
3093
|
-
* router definition object.
|
3094
|
-
*/
|
3095
|
-
$RouteProvider.$inject = ['$stateProvider', '$urlRouterProvider'];
|
3096
|
-
function $RouteProvider( $stateProvider, $urlRouterProvider) {
|
3097
|
-
|
3098
|
-
var routes = [];
|
3099
|
-
|
3100
|
-
onEnterRoute.$inject = ['$$state'];
|
3101
|
-
function onEnterRoute( $$state) {
|
3102
|
-
/*jshint validthis: true */
|
3103
|
-
this.locals = $$state.locals.globals;
|
3104
|
-
this.params = this.locals.$stateParams;
|
3105
|
-
}
|
3106
|
-
|
3107
|
-
function onExitRoute() {
|
3108
|
-
/*jshint validthis: true */
|
3109
|
-
this.locals = null;
|
3110
|
-
this.params = null;
|
3111
|
-
}
|
3112
|
-
|
3113
|
-
this.when = when;
|
3114
|
-
/*
|
3115
|
-
* @ngdoc function
|
3116
|
-
* @name ui.router.compat.$routeProvider#when
|
3117
|
-
* @methodOf ui.router.compat.$routeProvider
|
3118
|
-
*
|
3119
|
-
* @description
|
3120
|
-
* Registers a route with a given route definition object. The route definition
|
3121
|
-
* object has the same interface the angular core route definition object has.
|
3122
|
-
*
|
3123
|
-
* @example
|
3124
|
-
* <pre>
|
3125
|
-
* var app = angular.module('app', ['ui.router.compat']);
|
3126
|
-
*
|
3127
|
-
* app.config(function ($routeProvider) {
|
3128
|
-
* $routeProvider.when('home', {
|
3129
|
-
* controller: function () { ... },
|
3130
|
-
* templateUrl: 'path/to/template'
|
3131
|
-
* });
|
3132
|
-
* });
|
3133
|
-
* </pre>
|
3134
|
-
*
|
3135
|
-
* @param {string} url URL as string
|
3136
|
-
* @param {object} route Route definition object
|
3137
|
-
*
|
3138
|
-
* @return {object} $routeProvider - $routeProvider instance
|
3139
|
-
*/
|
3140
|
-
function when(url, route) {
|
3141
|
-
/*jshint validthis: true */
|
3142
|
-
if (route.redirectTo != null) {
|
3143
|
-
// Redirect, configure directly on $urlRouterProvider
|
3144
|
-
var redirect = route.redirectTo, handler;
|
3145
|
-
if (isString(redirect)) {
|
3146
|
-
handler = redirect; // leave $urlRouterProvider to handle
|
3147
|
-
} else if (isFunction(redirect)) {
|
3148
|
-
// Adapt to $urlRouterProvider API
|
3149
|
-
handler = function (params, $location) {
|
3150
|
-
return redirect(params, $location.path(), $location.search());
|
3151
|
-
};
|
3152
|
-
} else {
|
3153
|
-
throw new Error("Invalid 'redirectTo' in when()");
|
3154
|
-
}
|
3155
|
-
$urlRouterProvider.when(url, handler);
|
3156
|
-
} else {
|
3157
|
-
// Regular route, configure as state
|
3158
|
-
$stateProvider.state(inherit(route, {
|
3159
|
-
parent: null,
|
3160
|
-
name: 'route:' + encodeURIComponent(url),
|
3161
|
-
url: url,
|
3162
|
-
onEnter: onEnterRoute,
|
3163
|
-
onExit: onExitRoute
|
3164
|
-
}));
|
3165
|
-
}
|
3166
|
-
routes.push(route);
|
3167
|
-
return this;
|
3168
|
-
}
|
3169
|
-
|
3170
|
-
/*
|
3171
|
-
* @ngdoc object
|
3172
|
-
* @name ui.router.compat.$route
|
3173
|
-
*
|
3174
|
-
* @requires ui.router.state.$state
|
3175
|
-
* @requires $rootScope
|
3176
|
-
* @requires $routeParams
|
3177
|
-
*
|
3178
|
-
* @property {object} routes - Array of registered routes.
|
3179
|
-
* @property {object} params - Current route params as object.
|
3180
|
-
* @property {string} current - Name of the current route.
|
3181
|
-
*
|
3182
|
-
* @description
|
3183
|
-
* The `$route` service provides interfaces to access defined routes. It also let's
|
3184
|
-
* you access route params through `$routeParams` service, so you have fully
|
3185
|
-
* control over all the stuff you would actually get from angular's core `$route`
|
3186
|
-
* service.
|
3187
|
-
*/
|
3188
|
-
this.$get = $get;
|
3189
|
-
$get.$inject = ['$state', '$rootScope', '$routeParams'];
|
3190
|
-
function $get( $state, $rootScope, $routeParams) {
|
3191
|
-
|
3192
|
-
var $route = {
|
3193
|
-
routes: routes,
|
3194
|
-
params: $routeParams,
|
3195
|
-
current: undefined
|
3196
|
-
};
|
3197
|
-
|
3198
|
-
function stateAsRoute(state) {
|
3199
|
-
return (state.name !== '') ? state : undefined;
|
3200
|
-
}
|
3201
|
-
|
3202
|
-
$rootScope.$on('$stateChangeStart', function (ev, to, toParams, from, fromParams) {
|
3203
|
-
$rootScope.$broadcast('$routeChangeStart', stateAsRoute(to), stateAsRoute(from));
|
3204
|
-
});
|
3205
|
-
|
3206
|
-
$rootScope.$on('$stateChangeSuccess', function (ev, to, toParams, from, fromParams) {
|
3207
|
-
$route.current = stateAsRoute(to);
|
3208
|
-
$rootScope.$broadcast('$routeChangeSuccess', stateAsRoute(to), stateAsRoute(from));
|
3209
|
-
copy(toParams, $route.params);
|
3210
|
-
});
|
3211
|
-
|
3212
|
-
$rootScope.$on('$stateChangeError', function (ev, to, toParams, from, fromParams, error) {
|
3213
|
-
$rootScope.$broadcast('$routeChangeError', stateAsRoute(to), stateAsRoute(from), error);
|
3214
|
-
});
|
3215
|
-
|
3216
|
-
return $route;
|
3217
|
-
}
|
3218
|
-
}
|
3219
|
-
|
3220
|
-
angular.module('ui.router.compat')
|
3221
|
-
.provider('$route', $RouteProvider)
|
3222
|
-
.directive('ngView', $ViewDirective);
|
3223
|
-
})(window, window.angular);
|